トピック
くつねこ mamimusu

2進数をそのまま表示する方法を教えてください

AとBの2進数で表示してAとBをANDで計算したものも2進数で表示したいのですが、これだと10進数の状態で表示されてしまいます。 IF A==2 && B==2 THEN ? 10 とかしないとだめなのでしょうか?
0そうだね
プレイ済み
返信[1]
親投稿
なぜか2進変換関数(BIN$)が標準搭載されてないんですよね。 自作となるわけですけど、IFじゃなくて計算でできると思います。
2そうだね
プレイ済み
返信[2]
親投稿
おおみの Omi-no-mino-398
とりあえずやっつけで作ってみました。 INPUT B% :B$="" WHILE B% A$=STR$(B% MOD 2) B%=B% DIV 2 B$=A$+B$ WEND PRINT B$ 単純に2で割っていって余りが出たら1、ない場合は0を「右から左に」つけていくだけです。
3そうだね
プレイ済み
返信[3]
親投稿
DEF BIN$(B%) VAR B$="" WHILE B% B$=A$+STR$(1ANDB%) B%=B%>>1 WEND RETURN B$ END DEF化 ソース拝借、動作無保証(ダメじゃん)
2そうだね
プレイ済み
返信[4]
親投稿
くつねこ mamimusu
できました!ありがとうございます!
0そうだね
プレイ済み
返信[5]
親投稿
みむ*mim hidemimtp
0ビット目が、C AND POW(2,0) 1ビット目が、C AND POW(2,1) 2ビット目が、C AND POW(2,2)・・・・ をつなげればいいんじゃないかな。 これをFOR文などで回しますが、桁数は LOG(C,2) からうまく取ってください。 BIN$、欲しいですね。たまにチェックとかで必要になります。
3そうだね
プレイ済み
返信[6]
親投稿
いろいろやり方あるけど、関数なら元の数字を割っちゃても差し支えないからね
1そうだね
プレイ済み
返信[7]
親投稿
おおみの Omi-no-mino-398
所詮やっつけなので負の数はきちんと出ない欠点が判明。 しおんさん版で負の数を入れると永久ループにハマった・・・。 ビットシフトは符号ビットの1をずっと引きずってくる仕様かー。
1そうだね
プレイ済み
返信[8]
親投稿
ツララ LongIceSword
数値の先頭に「&B」を付けて、0と1で構成された数値なら2進数と認識されて、そのまま計算も可能ですけど、数値変数に代入の時点で10進数になっちゃうので、いったん文字列化しないとそのまま表示ってのは無理なんじゃないです? A=2進数化したい数値 B$="" '2進数文字列の出力先にする文字列変数 FOR CT=0 TO LOG(A,2):B$=STR$((POW(2,CT) AND A)>>CT)+B$:NEXT B$="&B"+B$ こんな感じで表示する用の2進数にできますけど、計算するときはVAL()命令で文字列を今度は数値に変換しないといけないのがちょっと面倒くさいですよね。
1そうだね
プレイ済み
返信[9]
親投稿
おおみの Omi-no-mino-398
負数対応版 IF B%<0 THEN B%=B% AND &H7FFFFFFF WHILE B% B$=STR$(B% AND 1)+B$ B%=B% >> 1 WEND B$="1"+RIGHT$("0"*31+B$,31) ELSE (前述のやつ) ENDIF 実装するの結構面倒くさいですね。
1そうだね
プレイ済み
返信[10]
親投稿
負数、そういう風になってるんだ
1そうだね
プレイ済み
返信[11]
親投稿
MIKI ifconfig
>> は「算術シフト」で 31bit 目が 30bit 目にコピーされます。 B% = B% >> 1 を B% = (B% >> 1) and &h7fffffff として 31bit 目に 0 を入れてやれば、「論理シフト」となり、 b% の符号で分岐する必要がなくなります。 あまさとさんのコードはバグってるので、おーみのみのさんのコードをベースにすればいいと思います。
1そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
以前、負数対応、最大で2の53乗まで対応(桁数は任意設定が可能)となるBIN$関数や実数対応のBIN64$関数を作りました。 https://miiverse.nintendo.net/posts/AYIHAAAEAAArVRTkBciitw BIN64$(0.1)で0011111110111001100110011001100110011001100110011001100110011010という値を返します。 0.1は2進数に変換すると循環小数になりますがBIN64$はIEEE754の倍精度浮動小数点に準じた64桁の2進数に変換します。
1そうだね
プレイ済み
返信[13]
親投稿
ツララ LongIceSword
みむさん式を負数に対応させるとこんな感じですかね。 A=二進数にしたい数 B$="" IF A THEN FOR CT=0 TO (A>0)*LOG(ABS(A),2)+(A<0)*30 B$=STR$((POW(2,CT) AND A)>>CT)+B$ NEXT ELSE B$="0" ENDIF B$="&B"+"1"*(A<0)+B$ デフォルトの命令に二進数文字列に変換するものが入ってないのは、もしかしたら「このくらい自力でなんとかしろ」と言うスマイルブームからの挑戦状・・・? 確かに自作で命令作ると理解が深まるので、結果オーライだったりしますけど。
1そうだね
プレイ済み
返信[14]
親投稿
Oskar oskar_liebig
もう答も出ているのでなんですが、一応。 >> は算術右シフトなんですが << は論理左シフトなので31bit目の符号もそのままシフトされます。 頭に0が並んでもよければ << で0~31ビット分順にシフトして、31bit目の0/1を !!(A AND &H80000000) で取り出していくと楽かも。
1そうだね
プレイ済み
返信[15]
親投稿
くつねこ mamimusu
たくさんのコメントありがとうございました!別の質問をしたいので受け付けを終了します!
0そうだね
プレイ済み