; 補数の加算でも減算できるぞぉ〜!のサンプル(謎) by Kosuke ; 注:フツーの人間はこんな計算しない… 但し知っておいて損ではない(と思う) ; ; そもそも補数とは…コンピュータ(大型のメインフレームみたいなやつからPICなんかのマイクロコンピュータまで全てのコンピュータ) ; が減算処理をするときに使う数。コンピュータは加算は得意だが減算は苦手なため、減算を加算に変えてしまうための数値。 ; コンピュータが減算処理をするときには引かれる数に補数を足してオーバーフローさせ、その時に残った数値を結果としている。 ; 人の考え方からすると面倒臭い方法だが、コンピュータは(Not 7)+1=9 12+9=5(+16)より12-7のほうが面倒臭い。 ; ; ※補数の求め方(引く数をa、補数をxと置く)…x=Not a+1 ; このプログラムでは引く数をmax(22行)-1の数値でXor(排他的論理和)演算をさせて補数を出している。 ; なぜなら、HSPでのNot計算方法を知らないため(^^; ; ; #module #deffunc dectobin int,int mref decimal, 0 mref offlag , 1 mref binary ,65 sdim binarya,256 totala=n@+offlag-1 repeat n@+offlag na=cnt:ra=1 repeat na ra=ra*2 loop nr=totala-na if decimal&ra:poke binarya,nr,'1':else:poke binarya,nr,'0' loop binary=binarya return #global title "補数の加算でも減算できるぞぉ〜!のサンプル(謎)" *start cls font "みかちゃん",16,0 randomize ; 有効ビット数の指定 ; maxには 8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768 のどれかを入力すること ; それぞれ 3,4,5,6,7,8,9,10,11,12,13,14,15ビットになる ; 多分256が一番わかりやすいと思う max=256 repeat 14,3 n=cnt:r=1 repeat n r=r*2 loop if max=r:break loop maxx=max-1 maxh=maxx:str maxh,16 rnd moto,maxx-1:moto+=2 await 2 rnd mns,moto:mns+=1 hiku=moto-mns+1 if hiku>=moto:hiku=1 ho_1=hiku^maxx hosu=ho_1+1 kea=moto+hosu kekka=(moto+hosu)\max dectobin moto,0 moto_b=refstr dectobin hiku,0 hiku_b=refstr dectobin ho_1,0 ho_1_b=refstr dectobin hosu,0 hosu_b=refstr dectobin kea,1 kea_b =refstr dectobin kekka,0 kekk_b=refstr mes "        ***補数の加算でも減算できるぞぉ〜!のサンプル(謎)***" mes "かきっこー[270]の書き込みから始まったこの調べもの、一体どこへ行き着くのやら(笑)" mes "それにしても、論理回路の作成・研究以外に使い道あるのだろうか、このプログラムは(^_^;)\n" mes "普通の計算式(人間はこれで計算する):"+moto+"-"+hiku+"\n補数:(Not "+hiku+")+1(="+maxx+"-"+hiku+"+1)=["+hosu+"]" mes "補数を使った計算式(コンピュータはこれで計算する):"+moto+"+"+hosu+"="+kea mes " (コンピュータの特性上、オーバーフローで"+maxh+"h="+maxx+"を超えると0に戻る)" mes "計算結果:"+kekka+"\n" mes " "+hiku_b+" ひく数" mes " "+ho_1_b+" 1の補数(ビット反転)\n" mes " "+hosu_b+" 2の補数(1の補数+1)" mes "+)"+moto_b+" ひかれる数" mes " ------------------------------------" mes " "+ kea_b +" 加算結果(手計算の場合)" mes " "+kekk_b+" 計算結果(o=1)" objmode 1:objsize 150,24 button "数値を変えてもう1回やってみる",*start stop