プログラムの中にfprintf(dst, "%0*X ", (CHAR_BIT + 3) / 4, (unsigned)buf[i]);
の表示がありますが、(CHAR_BIT + 3) / 4, がよく分かりません。このfprintfの中身を詳しく教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
書式について
'%' : 書式指定であることを表す
'0' : 数値の足りない桁数を0で埋める
'*' : 引数で指定した値がここに入る。この位置は桁数なので引数で動的に桁数を指定するという時に使う
'X' : 整数値を16進数表記で出力する
※詳しくはリファレンスを参照してください。
(CHAR_BIT + 3) / 4
CHAR_BITはcharのビット数を表すので、通常は8と定義されています。16進数の桁数として渡しているので、4bitがいくつ分になるかを計算しています。8bitは16進数2桁ということになります。
通常は"%02X"
で済むのですが、2
の部分を*
にして引数渡しで桁数を指定していることになります。ただし、最初から判っている桁数を引数渡しにすることはあまり一般的ではありません。
投稿2016/01/24 07:25
総合スコア5938
0
C
1fprintf(dst, "%0*X ", (CHAR_BIT + 3) / 4, (unsigned)buf[i]);
の意味は、おおざっぱに言うと
- buf[i] の内容を十六進数で適切な桁幅で出力する
という事です。
CHAR_BIT は limits.h に定義されている、char 型のビット数です。
現代の大体のCPU では char型が1バイトなので、 8 が定義されています。
bash
1$ cat sample.c 2#include <stdio.h> 3#include <limits.h> 4 5int main(int argc, char **argv) 6{ 7 printf( "[%d]\n", CHAR_BIT ); 8 9 return 0; 10} 11$ gcc -o sample sample.c 12$ ./sample 13[8] 14$
16進一桁は 4 ビットですので、出力しようとする変数の型のビット数を 4で割ることで必要な桁幅が求まります。
3 を足しているのはビット数がハンパな場合に適切な値がでるように補正するためです。
bash
1$ cat sample2.c 2#include <stdio.h> 3#include <limits.h> 4 5int main(int argc, char **argv) 6{ 7 int i; 8 9 for ( i = 1 ; i < 32; ++i ) { 10 printf( "[bit = %d][hex width = %d]\n", i, ( i + 3 ) / 4 ); 11 } 12 13 return 0; 14} 15$ gcc -o sample2 sample2.c 16$ ./sample2 17[bit = 1][hex width = 1] 18[bit = 2][hex width = 1] 19[bit = 3][hex width = 1] 20[bit = 4][hex width = 1] 21[bit = 5][hex width = 2] 22[bit = 6][hex width = 2] 23[bit = 7][hex width = 2] 24[bit = 8][hex width = 2] 25[bit = 9][hex width = 3] 26[bit = 10][hex width = 3] 27[bit = 11][hex width = 3] 28[bit = 12][hex width = 3] 29[bit = 13][hex width = 4] 30[bit = 14][hex width = 4] 31[bit = 15][hex width = 4] 32[bit = 16][hex width = 4] 33[bit = 17][hex width = 5] 34[bit = 18][hex width = 5] 35[bit = 19][hex width = 5] 36[bit = 20][hex width = 5] 37[bit = 21][hex width = 6] 38[bit = 22][hex width = 6] 39[bit = 23][hex width = 6] 40[bit = 24][hex width = 6] 41[bit = 25][hex width = 7] 42[bit = 26][hex width = 7] 43[bit = 27][hex width = 7] 44[bit = 28][hex width = 7] 45[bit = 29][hex width = 8] 46[bit = 30][hex width = 8] 47[bit = 31][hex width = 8] 48$
投稿2016/01/24 07:20
編集2016/01/24 07:51総合スコア1193
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
答えではないです。
"%0*X "の意味は判りますか?
・・・分かれば(CHAR_BIT + 3) / 4の意味も判ると思いますが?
CHAR_BITは?
(CHAR_BIT + 3) / 4は 11/4→2・・・(CHAR_BITが8として)
例として
c
1~/test/cpptst >./a.out 2C 3C 40C 500C 6000C 70000C 800000C 9000000C 100000000C 1100000000C 12~/test/cpptst >cat tst02.c 13#include <stdio.h> 14 15int main() 16{ 17 for( int i= 0; i < 10; i++ ){ 18 printf( "%0*X\n", i, 12 ); 19 } 20 21 return (0); 22} 23~/test/cpptst >
投稿2016/01/24 06:57
編集2016/01/24 07:16総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/01/24 07:41
0
ベストアンサー
こんにちは。
CHAR_BITを4で割ってますね。そして、小数点以下を「切り上げ」てます。
CHAR_BITを4で割った時、1余ったとします。その1にも3を加えて4で割るので、結果が1増えるのです。
CHAR_BITを4で割った時、3余ったとしてます。(3+3)/4=1.5→1なので、やっぱり結果は1しか増えないわけです。
投稿2016/01/24 06:55
総合スコア23272
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/01/24 07:32