• ベストアンサー

ビット構成について

今、ビットについて勉強しているのですが、わからないところがありますので、質問しました。わかる方がいれば、わかりやすく教えてください。(例として、整数xは10とした場合をしてもらえる助かります。) int count_bits(unsigned x){ int count = 0; while (x){ if (x & 1U) count++; x >>= 1; } return (count); } int int_bits(void){ return (count_bits(~0U)); } void print_bits(unsigned x){ int i; for ( i = int_bits() - 1 ; i >= 0; i--) putchar(((x >> i) & 1U) ? '1' : '0'); } 以上 まず、 int count_bits(unsigned x){ int count = 0; while (x){ if (x & 1U) count++; x >>= 1; } return (count); } についてですが、整数Xを10とした場合、私の考えではcount=2となると思うのですが・・・。 次に int int_bits(void){ return (count_bits(~0U)); } についてなのですが、count_bits関数で整数Xを10とした場合count=2となったあと、int_bits関数では全ビットを1にするということみたいですが、count_bits関数でおこなった作業をどうint_bits関数で処理するのかわかりません。 最後が for文の中の、(i = int_bits() - 1 ; i >= 0; i--) についてですが、整数10のときの i = int_bits() はどうなっているのでしょうか?? わかりにくい質問ですみません。 回答宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#50176
noname#50176
回答No.2

>整数Xを10とした場合、私の考えではcount=2となると思うのです >が・・・。 10(10進)=1010(2進)ですから 1010:0+0=0 101:0+1=1 10:1+0=1 1:1+1=2 2で合っています。 >count_bits関数で整数Xを10とした場合count=2となったあと… xが 0 になるまでの右シフト数を求めた後 void print_bits(unsigned x){ int i; for ( i = int_bits() - 1 ; i >= 0; i--) putchar(((x >> i) & 1U) ? '1' : '0'); } を呼び出し、xのすべての桁を表示するために マスクビット(すべて1)を用意しその回数を求めれば 全桁数が求まります。 例えば8ビットであれば、x=10の時、i=(1111111の桁数8)-1=7 で、 00001010 を 7ビット右へシフト時の1ビット目=0※、i=7-1=6 ・ ・ 00001010 を 3ビット右へシフト時の1ビット目=1※、i=3-1=2 00001010 を 2ビット右へシフト時の1ビット目=0※、i=2-1=1 00001010 を 1ビット右へシフト時の1ビット目=1※、i=1-1=0 00001010 を 0ビット右へシフト時の1ビット目=0※ ですね。 putchar(((x >> i) & 1U) ? '1' : '0'); によって ※の、1,0 を評価してそれぞれ文字の'1'と'0’を表示します。

hatenan114
質問者

お礼

ありがとうございます。 やっとわかりました。 またよろしくおねがいします。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

> のi = int_bits() の部分には32が入り、1の歩数をもとめるので、31ということになるのでしょうか? 1の補数とは無関係です。 print_bits関数は、引数で与えた数値の2進表現を左側から走査して、 ビットが立っているorいないを出力する関数です。 お使いの環境が32ビットであるならば、 右から数えて31ビット目~0ビット目の順に、 つまりいちばん左のビットからいちばん右のビットへ向かって 走査するようになっています。

hatenan114
質問者

お礼

ありがとうございます。 理解できました。 またよろしくお願いします。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

count_bits関数は、引数で渡した数値を2進数で表わしたときに、 いくつ'1'ビットが立っているかを返す関数です。 したがって、 > についてですが、整数Xを10とした場合、私の考えではcount=2となると思うのですが・・・。 10進数の10を2進数で表わすと1010ですので、2が返ってくるとの お考えは正しいです。やってみればすぐわかりますよね。 int_bits関数は、お使いの環境では整数を何ビットで 表わしているかを返す関数です。 そのために、count_bit関数に~0U、つまりすべてのビットが'1'であるような 値を渡しています。 10の場合とは切り離して考えてください。 > 整数10のときの i = int_bits() はどうなっているのでしょうか?? これも、10の場合とは切り離して考えてください。

hatenan114
質問者

補足

回答ありがとうございます。わかってきました。 ということは、 int int_bits(void){ return (count_bits(~0U)); } についてですが、私の環境では32ビットなので32ということですね。 そうすると、 void print_bits(unsigned x){ int i; for ( i = int_bits() - 1 ; i >= 0; i--) putchar(((x >> i) & 1U) ? '1' : '0'); } のi = int_bits() の部分には32が入り、1の歩数をもとめるので、31ということになるのでしょうか?

関連するQ&A