大家都知道,实现高效的C 语言编写的方法中,有一招是使用位操作。 我前几天在网上看到一篇**中讲到以下一个例子,就是关于移位运算的问题。 作者给了一个比较,首先是正常的运算: int I,J; I=257/8; J=456%32;
然后是位运算:
int I,J; I=257>>3; J=456-(456>>4<<4);
并说第二种方法仅仅是几句相关的汇编,代码更简洁、效率更高。 这是没错, 但是其中的J的运算表达式中,为什么要先右移4位后再左移4位? 它原来是除32求余,换算过来应该也是5位啊?那它移4位的结果应该会出错吧
于是我自己去Turbo C环境下试了试, 却发现不仅仅4行,6也行,运算结果都和5一样,只是3和7不一样 具体程序如下:
main() { int k,l,m,n,o;
k = 456 - (456>>3<<3); l = 456 - (456>>4<<4); m = 456 - (456>>5<<5); n = 456 - (456>>6<<6); o = 456 - (456>>7<<7);
printf("%d,%d,%d,%d,%d",k,l,m,n,o); }
其输出结果依次是:0,8,8,8,72
因此想在这求助各位大侠们,帮我解释一下为什么…… 多谢啦~~
|