0

コメント行が完全に機能x_tempしているのに、値を更新しないのはなぜですか。x &= ~(1 << i);どこが間違っていますか?

int x = 0x4567;
int x_temp = 0x0;// = 0xF0FF;
int y = 0x0200;
int i;
for(i = 8; i < 12; i++)
{//clean clear
    x_temp = x & ~(1 << i);
    //x &= ~(1 << i); //This line works perfectly.
}
printf("x_temp = %x....\n", x_temp);//Still it retains the value 0x4567.
printf("x = %x....\n", x);
y = x|y; //y = x_temp|y;
printf("y = %x\n", y);
4

2 に答える 2

3

ループの最後の反復でiは 11 ですが、 の 11 番目のビットxは既に 0 であるため、結果は 0x4567 です。なぜ他の何かを期待するのかわかりません。の場合、のの値をx &= ~(1 << i)少しクリアしますが、新しい値を に割り当て続けると... 1 つのケースは累積的ですが、もう 1 つのケースはそうではありません。xx_tempx_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 の値を生成します。 ...

于 2012-10-08T09:50:38.113 に答える
2

x_temp?の古い値を破棄しているからかもしれません。

for(i = 8; i < 12; i++)
{
    x_temp = x & ~(1 << i);
}

と同じです

x_temp = x & ~(1 << 11);
于 2012-10-08T09:49:12.280 に答える