[C语言的移位操作]
一,
I=257 = 1 0000 0001 (二进制)
I=257/8 = 32.125 = 32 (I为int类型)
I=257> > 3
=1 0000 0001> > 3 = 0...010 0000=2^5=32
右移3位将将最后一个001移除了,1/8=0.125 所以这等价是没问题的
二
J=456=0...01 1100 1000
J=456%32=8; (J为int类型)
J=456-(456> > 4 < <4);
456> > 4=0...01 1100 1000> > 4
=0...01 1100
然后再左移四位,则低四位补0: 0...01 1100 0000
上面两步实际上是将低四位变为了0,也就是由原来的1000变为现在的0000
所以现在数比移位操作前少了1000,也就是8
所以J=456-(456> > 4 < <4)=8
这里的求余运算我们还可以这样:
456=0...01 1100 1000=0x1c8
那么求456%32,就只要知道低5位是多大就OK了
所以456%32=0x1c8 & 0x01f,这样从第6位开始就全部变为0,余下的就是所求。
三
J=456=0...01 1100 1000
从上面的分析就知道
456> > 3 < <3比456而言就是低3位 000 变为现在的 000,
嘿嘿,没变,所以 k = 456 - (456> > 3 < <3)=0
456> > 4 < <4比456而言就是低4位 1000 变为现在的 0000,
小了8,所以 l = 456 - (456> > 4 < <4)=8
456> > 5 < <5比456而言就是低5位 01000 变为现在的 00000,
小了8,所以 m = 456 - (456> > 5 < <5)=8
456> > 6 < <6比456而言就是低6位 001000 变为现在的 000000,
小了8,所以 n = 456 - (456> > 6 < <6)=8
456> > 7 < <7比456而言就是低7位 1001000 变为现在的 0000000,
小了2^6+2^3=64+8=72,所以 o = 456 - (456> > 7 < <7)=72
发表时间:2008年11月4日19:04:28