前の質問と似たような質問ですが困っております。
ポインタに文字列を格納し
char *a="a";
char *b="ace";
このポインタの中身をASCIIコードで表示させるプログラム
ポインタaの中身aはASCIIコード2進数で********です。
ポインタbの中身aceはASCIIコード2進数で************************です。
という感じのプログラムを作りたいのですが、8進数表示はここで教えてもらい理解できましたが2進数への変換方法がわからりません。
もしよろしかったら具体例等のプログラムのご教授願います。
No.2ベストアンサー
- 回答日時:
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';
の部分がまだよく理解出来ません。
よろしかったら説明文をお願いします。
No.3
- 回答日時:
>よろしかったら説明文をお願いします。
簡単に動作を説明します。
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進数を文字列として得ることができます。
No.1
- 回答日時:
そのものずばりの関数は標準にはないですね。
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); // 最後に逆転
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- C言語・C++・C# C言語 配列とポインタについて 2 2022/06/02 11:53
- その他(プログラミング・Web制作) 文字コード及びフォントに関する次の記述を読み,適切なものをすべて選べ。 ASCIIとは,英数字だけを 4 2023/01/11 19:10
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、写真のプログラムをどう直せ 2 2022/07/09 21:13
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
ポインタを使って回文かどうか...
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
CStringからchar*への型変換に...
-
ポインタ配列
-
C言語にて構造体のメンバがNULL...
-
C言語:小文字を大文字に変換す...
-
strcat関数を自作したいです
-
char 文字列型 の表現範囲が-12...
-
C# ポインタ アクセス違反
-
new charとnew char[N]の違いは?
-
strcat関数
-
C++Builder 2009 テキスト...
-
36進数
-
[C] 構造体メンバーのカンマ区...
-
コマンドライン引数 *argv[]は...
-
DWORDとcharの変換
-
2次元配列の文字"列"の初期化方法
-
メモリを0クリアする方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
文字列str内の全ての数字を...
-
char 文字列型 の表現範囲が-12...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
文字列内の数字削除
-
c言語でポインタ変数を用いた配...
-
szとlpszの違い
おすすめ情報