プロが教える店舗&オフィスのセキュリティ対策術

今、ビットについて勉強しているのですが、わからないところがありますので、質問しました。わかる方がいれば、わかりやすく教えてください。(例として、整数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() はどうなっているのでしょうか??

わかりにくい質問ですみません。
回答宜しくお願いします。

A 回答 (3件)

>整数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’を表示します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/12 18:37

> のi = int_bits() の部分には32が入り、1の歩数をもとめるので、31ということになるのでしょうか?



1の補数とは無関係です。
print_bits関数は、引数で与えた数値の2進表現を左側から走査して、
ビットが立っているorいないを出力する関数です。
お使いの環境が32ビットであるならば、
右から数えて31ビット目~0ビット目の順に、
つまりいちばん左のビットからいちばん右のビットへ向かって
走査するようになっています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/12 18:38

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の場合とは切り離して考えてください。

この回答への補足

回答ありがとうございます。わかってきました。
ということは、
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ということになるのでしょうか?

補足日時:2007/08/12 17:32
    • good
    • 0

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