为什么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);发布于 2012-10-08 17:50:38
在循环的最后一次迭代中,i是11,但是x的第11位已经是0,所以结果是0x4567。我不知道你为什么要期待别的东西。在x &= ~(1 << i)的情况下,您将清除x的前一个值中的一位,而对于x_temp,您将一直为x_temp分配一个新值……一个案例是累积的,另一个不是。
考虑两个循环的跟踪:
对于x &= ~(1 << i),您有x为0x4567最初x为0x4467清除1<<8后x为0x4467清除1<<9后x为0x4067清除1<<11后1<<10 x为0x4067
但
对于x\_temp = x & ~(1 << i),x是0x4567 (最初和永远),从x清除1<<8后x_temp是0x4467 (没有变化)从x清除1<<9之后x_temp是0x4567 (没有变化)从x清除x_temp之后1<<10是0x4167 (没有变化)从x清除x_temp之后x_temp是0x4567 (没有变化)
也许这一点更清楚:假设x= 5;那么设置x += 1的循环将产生6,7,8,9,10,...但是设置x_temp =x+1的循环将产生6,6,6,6,6,...
发布于 2012-10-08 17:49:12
也许是因为您抛弃了x_temp的旧值
for(i = 8; i < 12; i++)
{
x_temp = x & ~(1 << i);
}等同于
x_temp = x & ~(1 << 11);https://stackoverflow.com/questions/12779149
复制相似问题