C言語は16進数(0xで始まる値)、10進数、8進数(0で始まる値)は扱えるが2進数は扱えない。大抵は2進数を表示する処理を別途作ったりする訳だけど、桁揃えとかゼロサプレスとか他の内容をまとめて表示するとなると色々と面倒。
そこで、ふと2進化10進数(BCD=binary-coded decimal)表現と同じように8進化2進数なるものをでっち上げれば便利に扱えるんじゃないかと思い付いた。つか、BCDなんてZ80の頃からあるんだから、C言語で8進化2進数なんてのも既に誰かがやってて車輪の再発明かも知れないケド(汗)
(2進化10進数は例えば16進数の0x39を10進数の39と見なして扱う表現のことで、今回の8進化2進数だと8進数の0101と2進数の0101と見なして扱うってこと)
itob関数がintの値を8進化2進数に変換、btoi関数がその逆を行う。intが32ビット幅なら8進数で16桁あるので16ビットまでの2進数を表現出来るハズ。もっと表現出来るビット数を増やしたい場合はintじゃなくunsigned long longとかにすれば良いかと思う。
これらの関数を使えば「a=btoi(01010111);」で01010111=0x57を変数aに代入できるし、「printf("%o",itob(0xc9));」で0xC9を2進数で表示できる。
#include <stdio.h> /* integer to octal-coded binary */ int itob(int a) { int b,c; b=1; c=0; while(a>0) { c=(a%2)*b+c; b=b*8; a=a/2; } return c; } /* octal-coded binary to integer */ int btoi(int a) { int b,c; b=1; c=0; while(a>0) { c=(a%8)*b+c; b=b*2; a=a/8; } return c; } int main(int argc,char *argv[]) { int a; a=0x47; printf("%02X = %08o\n",a,itob(a)); a=01000111; printf("%08o = %02X\n",a,btoi(a)); }
夕方6時すぎにTAKEを乗せて出発。まずは事務所で使う用紙の補充を買うってことで、DEEN宅近所のコーナンへ。その後、三ノ宮のセンタープラザへ移動。ドスパラ、とらのあな、じゃんぱらと定番ルートを巡回した後、那乃さんを迎えに地下鉄三宮駅へ。合流後、今日はラストオーダーまでにまだ間に合うってことでステーキ屋ケンちゃんへ。
まだ限定数あるってことで、ケンちゃん300セットをライス大盛りで注文。初めて食ったけど費用対効果抜群でボリューム満点だった。
その後、メロンブックスを回ってから駐車場に戻って自販機でジョージアのカフェオレを査収。久々にCoke ON対応自販機でスタンプ貯めた。今やってるワイヤレスイヤホン付きモバイルバッテリーは4/30までに100本買わないといけなのでたぶん無理だろうけど、25本でもらえるAmazonギフト券300円くらいは何とか。
TAKEを送ってから、第二神明で玉津まで走って那乃さんを西明石駅前のホテルに送った後、帰宅。何か眠かったのでこたつソファで寝てたら母親に起こされて風呂入ってから就寝。