ループの最後の反復でi
は 11 ですが、 の 11 番目のビットx
は既に 0 であるため、結果は 0x4567 です。なぜ他の何かを期待するのかわかりません。の場合、の前の値をx &= ~(1 << i)
少しクリアしますが、新しい値を に割り当て続けると... 1 つのケースは累積的ですが、もう 1 つのケースはそうではありません。x
x_temp
x_temp
2 つのループのトレースを考えてみましょう。
for `x &= ~(1 << i)`, you have
x is 0x4567 originally
x is 0x4467 after clearing 1<<8
x is 0x4467 after clearing 1<<9
x is 0x4067 after clearing 1<<10
x is 0x4067 after clearing 1<<11
しかし
for `x_temp = x & ~(1 << i)`, you have
x is 0x4567 (originally and forever)
x_temp is 0x4467 after clearing 1<<8 from x (which hasn't changed)
x_temp is 0x4567 after clearing 1<<9 from x (which hasn't changed)
x_temp is 0x4167 after clearing 1<<10 from x (which hasn't changed)
x_temp is 0x4567, after clearing 1<<11 from x (which hasn't changed)
多分これはより明確です: x = 5 とします。x += 1 を設定するループは 6,7,8,9,10 の値を生成しますが、x_temp = x + 1 を設定するループは 6,6,6,6,6 の値を生成します。 ...