2012-10-08 106 views
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); 

回答

3

在循环的最后一次迭代,i是11,但x第11位已经是0,所以结果是0x4567。我不知道你为什么期望别的东西。在x &= ~(1 << i)的情况下,您会清除之前的x的值,而使用x_temp您可以继续为x_temp分配新的值......一个是累积的,另一个不是。

考虑两个循环的痕迹:

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将产生的值的环...

+0

当我在做'X&=〜(1 << 11); 'x值从'0x4567'变为'0x4067'。但是'x_temp = x&〜(1 << 11);' –

+0

@RasmiRanjanNayak不会发生同样的情况是的,因为在一种情况下,你改变'x',而在另一种情况下你不改变。所以当你清除'x'中的下一个位时,在一种情况下,你使用的是修改过的'x'值,而另一种情况下你使用的是原始值。 –

+0

是的,现在我明白了。雅我的怀疑得到了欢呼......真的很好的解释,你们真是太棒了.. –

2

也许是因为你丢弃x_temp旧值?

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

相同

x_temp = x & ~(1 << 11); 
+0

如果是这样的话,那么'X&=〜(1 <<我)'是如何工作的? –

+0

@RasmiRanjanNayak因为你一直在改变x,所以这些改变是累积的。你需要多思考一下,因为它对Zeta和我以及其他许多人来说都是显而易见的。 –

+0

@RasmiRanjanNayak:'x&= v'与'x = x&v'相同。每个迭代中'x'的值都会改变。但是,'x_temp'不在赋值的右侧,所以它的值与结果无关。 – Zeta

相关问题