dポイントプレゼントキャンペーン実施中!

前の質問と似たような質問ですが困っております。
ポインタに文字列を格納し
char *a="a";
char *b="ace";
このポインタの中身をASCIIコードで表示させるプログラム
ポインタaの中身aはASCIIコード2進数で********です。
ポインタbの中身aceはASCIIコード2進数で************************です。
という感じのプログラムを作りたいのですが、8進数表示はここで教えてもらい理解できましたが2進数への変換方法がわからりません。
もしよろしかったら具体例等のプログラムのご教授願います。

A 回答 (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';
}

この回答への補足

前回の質問に続きこちらの方でも答えて頂きありがとうございます。
未だ初心者な私の知識だと
s[i]=((0x80>>i)&c)?'1':'0';
の部分がまだよく理解出来ません。
よろしかったら説明文をお願いします。

補足日時:2004/12/11 15:29
    • good
    • 0

>よろしかったら説明文をお願いします。


簡単に動作を説明します。

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進数を文字列として得ることができます。
    • good
    • 0
この回答へのお礼

詳しく解説ありがとうございました。
おかげで理解出来ました。

お礼日時:2004/12/12 10:31

そのものずばりの関数は標準にはないですね。


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); // 最後に逆転
    • good
    • 0
この回答へのお礼

8進や16進の様に関数は無いんですね。
処理方法ありがとうございました。

お礼日時:2004/12/11 15:10

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