69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,c,d,e,f;
a=257/8;
b=257>>3;
c=457%32;
d=457-((457>>5)<<5);
e=457-((457>>4)<<4);
f=457-((457>>3)<<3);
printf("sizeof(int):%u, a:%d,b:%d,c:%d,d:%d,e:%d,f:%d",sizeof(int),a,b,c,d,e,f);
return 0;
}
Ok,今天偶遇这么一个问题,感觉很新鲜.
大家都知道右移1位相当于对数值除2并取整。 c=457%32, 我试图用移位代替除法,所以有了d=457-((457>>5)<<5); 结果当然一样。
再看e=457-((457>>4)<<4); 结果依旧一样, 再看f=457-((457>>3)<<3); 结果就不对了.
分析457的二进制, 111001000 . 发现按照我们的想法,除32应该是右移5位,即除了5次2,d就是这个想法,结果也正确了.
但为什么少除1次也对呢? 看二进制发现4次移位并没有比移动5位带来更多的变化,通过4左移后与右移5位再左移5位结果一样.
而f则不对,因为不像d,e那样,f没有把那个1丢失,所以结果不是正确的了.
大家对此有什么感想么,我感觉很郁闷. 怎么这么巧.