- ベストアンサー
ASCIIコードへの変換方法
前の質問と似たような質問ですが困っております。 ポインタに文字列を格納し char *a="a"; char *b="ace"; このポインタの中身をASCIIコードで表示させるプログラム ポインタaの中身aはASCIIコード2進数で********です。 ポインタbの中身aceはASCIIコード2進数で************************です。 という感じのプログラムを作りたいのですが、8進数表示はここで教えてもらい理解できましたが2進数への変換方法がわからりません。 もしよろしかったら具体例等のプログラムのご教授願います。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
1文字のASCIIコードを2進数文字列に変換するには、一番上のビットから順番に0か1かを調べて'0'か'1'を並べていけばできます。 例えば、char buf[9];で9文字分のメモリを確保しておいて、下の関数で c2b(buf,'a'); とやれば、'a'の2進数表記をbufに格納できます。printf("%s",buf)で表示すればよいでしょう。 void c2b(char s[], char c) { int i; for (i=0; i<8; i++) { s[i]=((0x80>>i)&c)?'1':'0'; } s[i]='\0'; }
その他の回答 (2)
- JaritenCat
- ベストアンサー率37% (122/322)
>よろしかったら説明文をお願いします。 簡単に動作を説明します。 0x80は、2進数で書くと10000000。最上位ビットだけ1で残りが0です。 これと任意の数値でAND演算をやると、最上位ビット以外は必ず0で、最上位ビットが0なら00000000、最上位ビットが1なら10000000になります。つまり、0x80&cで変数cの最上位ビットの状態がわかるわけです。 >>iはiビットの右シフトですから、0x80>>iのiを増やすと、10000000、01000000、00100000、・・・と1のビット位置が変わっていきます。8回繰り返せば、8ビットをすべて調べることができます。 では、c=0x61(2進数で01100001)の場合を見てみましょう。 i (0x80>>i) (0x80>>i)&c 判定 ((0x80>>i)&c)?'1':'0' ------------------------------------------------------- 0 10000000 00000000 偽 '0' 1 01000000 01000000 真 '1' 2 00100000 00100000 真 '1' 3 00010000 00000000 偽 '0' 4 00001000 00000000 偽 '0' 5 00000100 00000000 偽 '0' 6 00000010 00000000 偽 '0' 7 00000001 00000001 真 '1' ※C言語の判定では、0のとき偽、0以外のとき真となります。 結局、この式で返ってくるのは、左からiビット目が1なら'1'、0なら'0'ですから、これを文字列用の変数に入れてやれば、2進数を文字列として得ることができます。
お礼
詳しく解説ありがとうございました。 おかげで理解出来ました。
- phoenix343
- ベストアンサー率15% (296/1946)
そのものずばりの関数は標準にはないですね。 2で割っていき、そのそれぞれの余りで文字列を追加していくしか。 とりあえず一文字のASCIIコードを2進数の文字列に変換する処理を… int a = 'a'; int cnt; char sic[9]; // ASCII一文字は8bit+ヌル文字分 for (cnt = 0; cnt < 8; cnt++ ) { if ( a % 2 ) sic[cnt] = '1'; else sic[cnt] = '0'; a /= 2; } sic[cnt] = 0; // 最後のヌル strrev(sic); // 最後に逆転
お礼
8進や16進の様に関数は無いんですね。 処理方法ありがとうございました。
補足
前回の質問に続きこちらの方でも答えて頂きありがとうございます。 未だ初心者な私の知識だと s[i]=((0x80>>i)&c)?'1':'0'; の部分がまだよく理解出来ません。 よろしかったら説明文をお願いします。