これからの季節に親子でハイキング! >>

perlスクリプトで疑似乱数ではなくCPUの演算回数を種にしてそこからランダム値の0か1を発生させるプログラムを作りました。
しかし、結果は片方に偏っています。どのようにすれば修正できますか?
動作環境はWindows 7+ActivePerlです。


$| = 1;

for(;;){
my ($c,$a);
for(;;){
$a++;
if( (time + length("qMiWcHyV") + length("aWyvVbeK") ) % 2) {

$c++;
}
my ($sec) = localtime(time);if($sec == 0 || $sec == 30 || $sec % 10 == 0){last;}
}
my ( $sec, $min, $hour, $mday, $mon, $year, $wno ) = localtime(time);
my $nowtime = sprintf( "%02d_%02d_%02d__%02d_%02d_%02d", $year + 1900, $mon + 1, $mday, $hour, $min, $sec );

open( F , ">>Result.txt" );
print F "$nowtime\tResult\t" , $c/$a , "\n";
print "$nowtime\tResult\t" , $c/$a , "\n";
close(F);
sleep 1;
}

=======================
結果はとなり偏っています。
2018_10_30__23_33_50 Result 0.550934067688598
2018_10_30__23_34_00 Result 0.545030700601732
2018_10_30__23_34_10 Result 0.556725318480547
2018_10_30__23_34_20 Result 0.549527231125661
2018_10_30__23_34_30 Result 0.55964066863353

A 回答 (6件)

むしろ、値が揃い過ぎていて乱数としての使えないように思います。


1の後は0になりやすい
1が続いた後は0の割合が高くなる
といった傾向がありそうです。
    • good
    • 0

ANo.3です。


本当のところは何が欲しいのかです。
真の乱数と暗号論的乱数の違いは、実際の乱数列をみても簡単に識別できるものではありません。なので真の乱数に拘るなら、その作り方から真の乱数になるとロジカルに証明することが必要です。
そうでなく単にそれっぽい乱数を作るだけなら、単純にカウンタを暗号論的ハッシュ関数に通せば十分なものが作れるでしょう。

それで物理乱数生成器ですけど、ANo.3のリンク先はIvy Bridgeに物理乱数生成器を搭載したという記事です。何で最近のIntel CPUなら真の乱数に近い乱数をCPU命令で生成できるという理解で良いですね。
perlでインラインアセンブラしたり、アセンブラ関数をライブラリとしてリンクすることができるか知りませんけど、そういう方法で乱数生成命令を呼び出せば解決できます。
あとLinuxの/dev/randomですけど、Linuxを使えといっているのではなくて、そのソースを参考にすれば近い性能のものを作れるでしょうということです。
# カーネルで実装されているものなのでアプリでは再現できない可能性はありますが
    • good
    • 0

>また、もしよろしければ、真にランダム(0と1の2値)な数字を簡単に発生させる方法はありますでしょうか?


たぶん、ないと思います。
あなたの考え方の延長で、現在時刻をマイクロ秒まで取得し、その最後の桁(1の位)、(又は10の位)が奇数なら、カウントする
という考え方もありかと。
以下は、マイクロ秒の10の位が奇数の場合にカウントする方法です。
マクロ秒の取得は下記を参照。
http://d.hatena.ne.jp/hitotec/20121203/1354548250
マクロ秒は6桁の数値です。こちらで確認した限りでは、
1の位で判定よりは、10の位で判定したほうが若干50%の確率に近いです。

use Time::HiRes qw/ gettimeofday /;
$| = 1;
for(;;){
my ($c,$a);
$a = 0;
$c = 0;
for(;;){
$a++;
my ($epocsec, $microsec) = gettimeofday();
#if($microsec%2){ #1の位が奇数の場合
if(int($microsec/10)%2){ #10の位が奇数の場合
$c++;
}

my ($sec) = localtime();
if($sec == 0 || $sec == 30 || $sec % 10 == 0){last;}
}
my ( $sec, $min, $hour, $mday, $mon, $year, $wno ) = localtime();
my $nowtime = sprintf( "%02d_%02d_%02d__%02d_%02d_%02d", $year + 1900, $mon + 1, $mday, $hour, $min, $sec );

open( F , ">>Result.txt" );
print F "$nowtime\tResult\t" , $c/$a , "\n";
print "$nowtime\tResult\t" , $c/$a , "\n";
print "$c $a \n";
close(F);
sleep 1;
}
    • good
    • 0

疑似乱数ではなく真の乱数を作りたい。

処理時間のゆらぎを利用して真の乱数を作ろうとしている。
ということで良いですか?
マジメにやるなら色々と複雑なことをやったから大丈夫という話ではないので、素直に物理乱数生成器に頼った方が安心と思いますよ。あるいはLinuxの/dev/randomとか。
# https://news.mynavi.jp/article/20110921-ivy_brid …
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
その通りです。処理時間についてはかなりの揺らぎがあるような気がしますのでこれを利用できない物かと思っています。
このコードでもsleep の部分を2に変更するとかなり精度の良い物が得られているような気もしています。
また、物理乱数生成器は憧れますが店頭で見たことが無く恐らくとても高価な物かと思います。
また、Windows+Perlの組み合わせで連携させるのが難しそうなため断念しています。
LinuxOSを使う方法については廉価に本物の乱数が手に入りそうですが、このプログラムのためだけに
こちらを用意するのは大変ですので出来ればWindowsで実装できればと思っています。
他にもネットを利用してその処理時間を種に使う方法も考えたのですが大量のアクセスをするわけにもいきませんしアイデア止まりになっています。

お礼日時:2018/10/31 18:48

No1です。


>なぜ、このようなことが起きるのでしょうか?
>もしよろしければ教えて下さい。

あなたの提示した
if( (time + length("qMiWcHyV") + length("aWyvVbeK") ) % 2) {
$c++;
}
の箇所ですが、
まず、length("qMiWcHyV")は8であり、length("aWyvVbeK")も8です。
従って、
if( (time + 8 + 8 ) % 2) {
$c++;
}
と同じであり、timeの値が奇数か否かを判定する場合に、特に8+8を追加する必要はありません。
(なぜ、このようにしたのか不明ですが、それは置いといて・・・)

奇数秒の場合に$cに1加算する処理を繰り返し、
秒数が10の倍数(0,10,20,30,40,50)になれば終了しています。
次回は1秒スリープに行いますので、1,11,21,31,41,5秒が開始秒です。
1秒が開始秒の場合を例にとると、
1秒台のループ・・・1回目
2秒台のループ
3秒台のループ・・・2回目
4秒台のループ
5秒台のループ・・・3回目
6秒台のループ
7秒台のループ・・・4回目
8秒台のループ
9秒台のループ・・・5回目
まで、ループが行われます。
ここで、奇数秒になるのは、
1,3,4,7,9秒台のループです。これは、5回発生します。
これは2,4,6,8秒台のループが4回に対して、5回なので、奇数秒と判断される確率が5/9になります。
その為、あなたが提示された現象が発生します。

一方、スリープを2秒にすると、
開始時刻は2秒からになるので
2秒台のループ
3秒台のループ・・・1回目
4秒台のループ
5秒台のループ・・・2回目
6秒台のループ
7秒台のループ・・・3回目
8秒台のループ
9秒台のループ・・・4回目
となり、奇数秒と偶数秒は同じ確立になります。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。

ずっと考えていたのですが全く気づきませんでした!説明頂きありがとうございます!!
if( (time + length("qMiWcHyV") + length("aWyvVbeK") ) % 2)
に付きまして、実際のコードはもう少し複雑にしています。ここで様々な処理をさせればCPUの演算能力を無駄に消費します。CPUで他の作業をやっていたり場合によっては電圧や熱の変化など外部からの全く予期できない物が種になり、真にランダムな値を生成できるのではないかと思い行っています。
また、もしよろしければ、真にランダム(0と1の2値)な数字を簡単に発生させる方法はありますでしょうか?
上記のコードで簡単にできると思っていたのですが、深く考えると想像以上に難しい気がしてまいりました。

なお、my ($sec) = localtime(time);if($sec == 0 || $sec == 30 || $sec % 10 == 0){last;}
の部分で$sec % 10 == 0が混じっているのは当初0と30で判定していたのですが偏りがあることに気付きそれを調査するためにとりあえず付け加えたコードになります。

お礼日時:2018/10/31 16:05

sleep 1;を


sleep 2;
に変えてみてはいかがでしょうか。結果が良くなると思います。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
14時間回していた現在でも
2018_10_31__14_52_10 Result 0.553409240805363
2018_10_31__14_52_20 Result 0.558287022728528
2018_10_31__14_52_30 Result 0.548569603435258
2018_10_31__14_52_40 Result 0.558731758661291
2018_10_31__14_52_50 Result 0.560720398556925
2018_10_31__14_53_00 Result 0.566833446961911
2018_10_31__14_53_10 Result 0.564483207403289
2018_10_31__14_53_20 Result 0.565308799725402
と悪いですが、

sleep 2;にすると途端に結果が改善しました。
2018_10_31__14_53_20 Result 0.499576150031129
2018_10_31__14_53_30 Result 0.484293791668217
2018_10_31__14_53_40 Result 0.495102641228422
2018_10_31__14_53_50 Result 0.503479995321015
2018_10_31__14_54_00 Result 0.503593531454864
2018_10_31__14_54_10 Result 0.497375609192218

なぜ、このようなことが起きるのでしょうか?
もしよろしければ教えて下さい。

お礼日時:2018/10/31 14:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QPerlのプログラミングに困っています。

Perlでプログラムを書いています。
整数を1個受け取ってその整数の数だけコマンドプロンプト上に*の記号を使って縦横に左上の向きの直角三角形を表示させる方法はどのようにやるのでしょうか。
例えば「5」という数字を受け取った場合は
*****
****
***
**
*
のように表示させたいです。
宜しくお願いします。

Aベストアンサー

あなたのソースを多少修正しました。
以下のようにしてください。
---------------------------------------------
print '正整数を入力して下さい: ';
$n = <STDIN>;
chomp($n);

while ($n > 0) {
$y = $n;
while ($y > 0) {
print "+";
$y--;
}
print "\n";
$n--;
}

Qpythonの集合のデータ変更

pythonの集合は、データに順番が無いようですが、
a = {1, 2, 3}

a = {1, 4, 3}
のように2番目のデータを2→4に変更することってできるのでしょうか?

Aベストアンサー

直接、更新するメソッドはないので
4を追加して、2を削除します。
a.add(4)
a.remove(2)

Qsleep関数の原理について

sleep関数がPC内でどういった原理で一定時間おきに動作などを行っているのか教えてください。
「Linuxカーネルがどういう働きしている」「ハードがどういう動作している」とかです。

Aベストアンサー

>一定時間おきに動作などを行っているのか
確実にsleep関数で指定した時間はお休みしているだけであり、
厳密には「一定時間おき」に動作はしません。

・LinuxはマルチタスクOSである
・一定時間(確か100Hzだったと思います)ごとにタスク切り換えを行っている

この2点がわかっていれば、
>「Linuxカーネルがどういう働きしている」
は簡単ですよね。

「sleep関数で指定した時間は、タスク切り換えで自分にCPU時間を割り当てることはしない」というだけです。

>「ハードがどういう動作している」
特段ハードでは、sleep関数実現のために何もしていません。

<おまけ>
sleep関数を呼ばなくてもマルチタスクOS上のタスクは、
 ユーザの知らないタイミングで休み休み動いている
ということです。

QC言語でプログラミングを組みたいんですがcosの使い方がわかりません

x_i = cos((pi*(2i-1))/2N) (i=1,2,…,N)

という式で、N=5,9,17の時の値を求めたいのですが、うまくできません。

頑張ってN=5の式を作ってみたのですがうまくいきませんでした。
C言語、プログラミング初心者でわからないのでできるだけ丁寧に教えていただけると助かります。

自分で作ってみたプログラムを書いてみたので、どこが違うか、またどうすればいいかを教えていただきたいです。



#include <stdio.h>
#include <math.h>

#define iMAX 5

#define PI 3.1415926535


int main()
{

int i ;

int x[iMAX] ;

int n = ((PI * (2i-1) ) / 10) ;

double cos ( n ) ;



for (i = 1; i < 5; i++) {

x[i] = cos ( n );

}


for (i = 1; i<=5; i++) {

printf("x[%d] = %d\n",i,x[i]);

}


return 0 ;


}

x_i = cos((pi*(2i-1))/2N) (i=1,2,…,N)

という式で、N=5,9,17の時の値を求めたいのですが、うまくできません。

頑張ってN=5の式を作ってみたのですがうまくいきませんでした。
C言語、プログラミング初心者でわからないのでできるだけ丁寧に教えていただけると助かります。

自分で作ってみたプログラムを書いてみたので、どこが違うか、またどうすればいいかを教えていただきたいです。



#include <stdio.h>
#include <math.h>

#define iMAX 5

#define PI 3.1415926535


i...続きを読む

Aベストアンサー

cosの結果はdouble型です。
x_i = cos((pi*(2i-1))/2N) は、コード上、正確には
x_i = cos((pi*(2*i-1))/(2*N)) です。
N=5の場合、iを1からNまで変化させればOKです。
以下のようにしてください。
#include <stdio.h>
#include <math.h>
#define N 5
#define PI 3.1415926535
int main()
{

int i;
double x_i;
for (i = 1; i <= N; i++) {
x_i = cos((PI*(2*i-1))/(2*N));
printf("x[%d] = %f\n",i,x_i);
}
return 0;
}
-----------------------
以下、実行結果です。
x[1] = 0.951057
x[2] = 0.587785
x[3] = 0.000000
x[4] = -0.587785
x[5] = -0.951057

cosの結果はdouble型です。
x_i = cos((pi*(2i-1))/2N) は、コード上、正確には
x_i = cos((pi*(2*i-1))/(2*N)) です。
N=5の場合、iを1からNまで変化させればOKです。
以下のようにしてください。
#include <stdio.h>
#include <math.h>
#define N 5
#define PI 3.1415926535
int main()
{

int i;
double x_i;
for (i = 1; i <= N; i++) {
x_i = cos((PI*(2*i-1))/(2*N));
printf("x[%d] = %f\n",i,x_i);
}
return 0;
}
-----------------------
以下、実行結果です。
x[...続きを読む

Q構造体の勉強をしているのですが1と2は同じなのでしょうか?違うのでしょうか? もし違うならなぜ違うの

構造体の勉強をしているのですが1と2は同じなのでしょうか?違うのでしょうか?
もし違うならなぜ違うのか説明してください‼︎
よろしくお願いします。

1.typedef struct roll{メンバー};

2.typedef struct {メンバー}roll;

Aベストアンサー

「struct の直後に来るのが型でメンバーの後に来るのが新しい構造体の名前」の「型」と「構造体の名前」の違いってなんだろ.

さておき, これは typedef の仕様との関係がありますねぇ.

まず構造体の定義を完全に書くと
struct 構造体タグ メンバー定義 宣言子;
という形になります. ここで構造体タグは識別子, メンバー定義は
{ メンバーの宣言 }
という形で宣言子は変数やら配列やらポインタやらを表します. struct 以外は省略可能なのですが, 実際に意味を持つのは
・宣言子を省略する: 「struct 構造体タグ」で表される新しい構造体を定義する
・メンバー定義を省略する: 「struct 構造体タグ」で表される構造体型の変数などを宣言する
・構造体タグを省略する: 構造体タグがなんらかの理由で不要なときにはこの形式もあります
・メンバー定義と宣言子を省略する: 「struct 構造体タグ」で表される構造体型があることを宣言する
の 4つに限られます (全部省略しちゃダメなのは明らかだと思うけど). 再度確認しておくと, 「struct 構造体タグ」で 1つの型を表します.

質問文にある 2つの文を (typedef を除いて) 解釈するとそれぞれ
1. 宣言子を省略している. roll が構造体タグで, 「struct roll」という型を定義する
2. 構造体タグを省略している. roll は宣言子で, この場合は roll という変数を宣言する
となります. そして, *typedef がなければ*どちらも合法です (ただし, 当然ですが意味は違います).

で typedef の影響が出ます. typedef は
宣言子に含まれる識別子に対し, 「typedef がなければ与えられるはずの型」の別名として定義する
という働きをもちます. 例えば
int FOO, *Bar;
だと
・FOO は int型の変数
・Bar は int へのポインタ型の変数
なので, ここに typedef を付けた
typedef int FOO, *Bar;
では
・FOO は int型の別名
・Bar は int へのポインタ型の別名
となります. このように typedef では「別名を定義する」都合上, 宣言子はどうしても必須となります. 従って, 宣言子が省略された 1 はダメということになります.

「struct の直後に来るのが型でメンバーの後に来るのが新しい構造体の名前」の「型」と「構造体の名前」の違いってなんだろ.

さておき, これは typedef の仕様との関係がありますねぇ.

まず構造体の定義を完全に書くと
struct 構造体タグ メンバー定義 宣言子;
という形になります. ここで構造体タグは識別子, メンバー定義は
{ メンバーの宣言 }
という形で宣言子は変数やら配列やらポインタやらを表します. struct 以外は省略可能なのですが, 実際に意味を持つのは
・宣言子を省略する: 「struct 構造体タグ」...続きを読む

QCのif文の書き方の質問です

『x=a & j=1 』の様に、『&』の前後に式を書くことがありますか?
使ったことがないので、ここに質問させて頂いております。
コメント、説明頂けますと大変有り難いです。

if stype=='L' then
x=a & j=1 //===
elseif stype=='M' then
x=a+(h/2) & j=2//============
else x=a+h & j=3//=================
end

以上、宜しくお願いします。

Aベストアンサー

見た目から、命令の区切りに使っているように見えますが、
公式マニュアルを確認しても ; や , はありましたが & は見つけられなかったので断言はできません。

https://help.scilab.org/docs/6.0.1/ja_JP/comma.html
https://help.scilab.org/docs/6.0.1/ja_JP/semicolon.html

Q 文字列か数字かの判別

プログラミングを学び始めたばかりのものです。pythonでif,for, whileを習い、100点満点のテストの点数を入力してその合計点、平均点を出し、その後の選択肢にyと入力するとまた繰り返す、というプログラムを書いています。複数のテスト結果を入力した後にendと入力すると、それまでの結果の合計を平均を計算するようにしています。0以下、あるいは100以上の数字を入力すると、数字は0から100ですよ、と警告を出すようにしています。
以下が私が書いたコードなのですが、これだとend以外の文字列を入力したときに、
if int(score)>=0 and int(score) <=100:
の処理をするときに、scoreがintじゃなきゃダメだよ、というエラーが出ます。
end以外の文字を入れたときに、0以下、または100以上の数字を入れた時と同じ処理、つまり警告を出したいのですが、どのようにすればいいでしょうか。
よろしくお願いします。

print("The Test Score program\n")
print ("Enter test scores")
print ('enter"end"to end the input')
print ("==========================")
total = 0
counter = 0

while True:
score = input ("Enter test score: ")
if score != "end":
if int(score)>=0 and int(score)<=100:
total = total + int(score)
counter+=1
else:
print ("Test score must be a number from 0 through 100. try again.")
else:
print ("==========================")
ave = total / counter
print ("total score:",total)
print ("avaerage score: ",ave)
total = 0
ave = 0
score = 0
counter = 0
enter = input ("Enter more sets of tests? (y/n)")
if enter.lower() == "y":
continue
else:
break

プログラミングを学び始めたばかりのものです。pythonでif,for, whileを習い、100点満点のテストの点数を入力してその合計点、平均点を出し、その後の選択肢にyと入力するとまた繰り返す、というプログラムを書いています。複数のテスト結果を入力した後にendと入力すると、それまでの結果の合計を平均を計算するようにしています。0以下、あるいは100以上の数字を入力すると、数字は0から100ですよ、と警告を出すようにしています。
以下が私が書いたコードなのですが、これだとend以外の文字列を入...続きを読む

Aベストアンサー

No.1です。

> score.isdecimal():
> としたいところなのですが、どうもそうはいかないようです。
> 変数scoreがintなのかstrなのかを判別して

何か誤解なさっていると思います。
変数scoreに入力されているのは「文字列」(str)です。
その文字列が、10進数として読み取れ、intに変換できるかを判断するのが score.isdecimal() です。

こちらで確認しましたが以下サンプルでは問題なく判断が行われています。

-----test.py
while True:
score = input ("Enter test score: ")
print(score.isdecimal())
------------

> python test.py
Enter test score: 123
True
Enter test score: 12a
False
Enter test score: abc
False


これをif文の判断に組み込んで、score.isdecimal()がTrueなら通常処理を、Falseならエラー処理を行えば良いだけですね。

No.1です。

> score.isdecimal():
> としたいところなのですが、どうもそうはいかないようです。
> 変数scoreがintなのかstrなのかを判別して

何か誤解なさっていると思います。
変数scoreに入力されているのは「文字列」(str)です。
その文字列が、10進数として読み取れ、intに変換できるかを判断するのが score.isdecimal() です。

こちらで確認しましたが以下サンプルでは問題なく判断が行われています。

-----test.py
while True:
score = input ("Enter test score: ")
print(score.isdecimal())
-----...続きを読む

Q親ループのループ変数$_を子ループから参照したい

for(0 .. 2) {
for(3 .. 5) {
print($_)
}
}
子ループ内で親ループのループ変数$_を参照したいです。
子ループ内では$_は子ループに局所化されてしまい、このままでは親ループで使用している同名のループ変数$_を参照できないのですが、この親ループのループ変数$_を何とかして見る方法はありますか。
別名の変数を用意すれば簡単に解決する問題ですが、同名の変数でも参照するやり方があれば知りたいです。

Aベストアンサー

ないです.

Qc言語の課題がわかりません

XOR を用いて文字列の暗号化及び暗号化された文字列の復号化をするプログラムを作成し,暗号化した文字列の結果は code.txt に出力し、復号化する際には code.txt からファイルを読み込んで復号化することとし、入力する文字列は最大で 9 文字までとする。暗号化および復号化には鍵として1つの文字用いる。鍵は暗号化の際に入力させ、復号化の際にも同じ鍵を用いる。暗号化は文字列の各文字ごとに鍵との間の XOR を取るものとする。と課題で出たのですが、自分には難しすぎて出来ません。どなたかおしえてください。プログラムの途中経過と実行例を記しておきます。
#include<stdio.h>
int main(){
int x;
char a[256],b[256];

printf("Select Mode 1.Encryption, 2.Decryption :");
scanf("%d",&x);
if(a==1){
printf("Input passphrase :");
scanf("%s",a);
printf("Input key:");
scanf("%d",b);
}else{
printf("Input key:");
scanf("%d",b);

}

if(a==3){
printf("Invalid value\n");
}
return 0;
}
<実行例 1>
Select Mode 1.Encryption, 2.Decryption : 1
Input passphrase : password
Input key : $
TEWWSKV@
<実行例 2>
Select Mode 1.Encryption, 2.Decryption : 2
Input key : $
Code : TEWWSKV@
Decode : password
<実行例 3>
Select Mode 1.Encryption, 2.Decryption : 3
Invalid value

XOR を用いて文字列の暗号化及び暗号化された文字列の復号化をするプログラムを作成し,暗号化した文字列の結果は code.txt に出力し、復号化する際には code.txt からファイルを読み込んで復号化することとし、入力する文字列は最大で 9 文字までとする。暗号化および復号化には鍵として1つの文字用いる。鍵は暗号化の際に入力させ、復号化の際にも同じ鍵を用いる。暗号化は文字列の各文字ごとに鍵との間の XOR を取るものとする。と課題で出たのですが、自分には難しすぎて出来ません。どなたかおしえてください...続きを読む

Aベストアンサー

以下、ファイルの入出力を絡めると理解が遠のくので、
シンプルに、画面を通しての入出力動作をするものにしました。
forループの中で行っている1行が最も重要な箇所なので、じっくり理解して下さい。

#include<stdio.h>
#include<string.h>

int main() {
int x;
char a[9+1];
char b[1+1];
char r[9+1];

memset(a, 0x00, sizeof(a));
memset(b, 0x00, sizeof(b));
memset(r, 0x00, sizeof(r));

printf("Select Mode 1.Encryption, 2.Decryption : ");
scanf_s("%d", &x);
if (x == 1) {

printf("Input passphrase : ");
scanf("%s", a);

printf("Input key: ");
scanf("%s", b);

} else if (x == 2) {
printf("Input key: ");
scanf("%s", b);

printf("Code : ");
scanf("%s", a);

printf("Decode : ");

} else {
printf("Invalid value\n");
return 0;
}

for (unsigned int i = 0; i < strlen(a); i++) {
r[i] = a[i] ^ b[0];
}

printf("%s\n", r);

return 0;
}

以下、ファイルの入出力を絡めると理解が遠のくので、
シンプルに、画面を通しての入出力動作をするものにしました。
forループの中で行っている1行が最も重要な箇所なので、じっくり理解して下さい。

#include<stdio.h>
#include<string.h>

int main() {
int x;
char a[9+1];
char b[1+1];
char r[9+1];

memset(a, 0x00, sizeof(a));
memset(b, 0x00, sizeof(b));
memset(r, 0x00, sizeof(r));

printf("Select Mode 1.Encryption, 2.Decryption : ");
scanf_s("%d", &x);
if (x == 1) {

printf(...続きを読む

Q特殊な演算

2進数で表記された2つの数字を以下の演算で別の値を出す方法を考えています

その演算は同桁の数字が0と0なら0を
1と0,0と1なら1を
1,1も1
です。

010 と011 なら
1桁目が0、1なので1
2桁目は1,1なので1
3桁目は0,0なので0
となり 011 を返す


同桁の数字が0と0なら0を
1と0,0と1も0を
1,1は1
というバージョンも考えるのですが

エクセルでこのような演算を考えるには
関数であれVBAであれ
まず文字列としてleft() とか right() mid()を使って同桁の数字を取り出し
それを数値に直して計算し、3桁目*4+2桁*2+1桁 をして2進数表記にすればいいでしょうか?

それよりもっと楽なやり方はあるでしょうか?

お願いいたします

Aベストアンサー

使ってるExcelが2013かそれより新しければ、ビット演算関数があるので一発です。それより古いバージョンではVBAを使うか、1桁ごとに分解して演算するしかないですが。


人気Q&Aランキング