首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这段代码不能按预期工作

为什么这段代码不能按预期工作
EN

Stack Overflow用户
提问于 2012-10-08 17:46:03
回答 2查看 73关注 0票数 0

为什么x_temp没有更新值,正如注释行所示,x &= ~(1 << i);工作得很好。哪里出了问题?

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,...

票数 3
EN

Stack Overflow用户

发布于 2012-10-08 17:49:12

也许是因为您抛弃了x_temp的旧值

代码语言:javascript
复制
for(i = 8; i < 12; i++)
{
    x_temp = x & ~(1 << i);
}

等同于

代码语言:javascript
复制
x_temp = x & ~(1 << 11);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12779149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档