質問: "); print_bits(~b); /* bの1の補数 */ putchar('\n'); return 0; } ```
回答: * int count_bits(unsigned x) シフト演算子「`>>`」がポイントです。 `x >>= 1`は`x = x >> 1`と同じで、xを右に1ビットシフトする、という意味です。 > > x == 1011 と仮定すると、 > > 1回目のwhile ... x != 0 なので、やる > > x == 1011, bits == 0 > > x & 1U == 0001 なので bits++ (bits==1) > > x >>= 1 つまり x = x >> 1、x == 0101になる > > 2回目のwhile ... x != 0 なので、やる > > x == 0101, bits == 1 > > x & 1U == 0001 なので bits++ (bits==2) > > x >>= 1 して x == 0010 > > 3回目のwhile ... x != 0 なので、やる > > x == 0010, bits == 2 > > x & 1U == 0000 なので bits++ しない (bits==2) > > x >>= 1 して x == 0001 > > 4回目のwhile ... x != 0 なので、やる > > x == 0001, bits == 2 > > x & 1U == 0001 なので bits++ (bits==3) > > x >>= 1 1 して x == 0000 > > 5回目のwhile ... x == 0 なので、やらない > > bits(3)を返す。 > > > 以上のように、与えられたxのセットされたビット数(1の数)を返します。 * int int_bits(void) 否定演算子「`~`」がポイントです。 `~0U`(0の否定)、つまり 全ビットが1 な値をcount_bitsのxに与える。 したがって、unsigned のビット数が数えられ、戻り値として返ります。 * void print_bits(unsigned x) シフト演算子「`>>`」の応用です。 `b >> n`は、bをnビット右シフトする、という意味です。 仮に 4bit だとすると、`for (i = 3; i >= 0; i--)`となり、 `x >> 3, x >> 2, x >> 1, x >> 0`のように、一番左の桁から順に putchar(1なら'1'を、0なら'0'を表示)を繰り返します。