位运算相关解释
位运算有三种,分别是带符号位移运算与无符号位移运算,其中带符号位移运算又分为左移(<<)和右移(>>),符号位均参与移动,只有负数进行左移时最高位补1,其它情况均在空位处补0,而无符号位移运算只有右移(>>>),并且向右移动时正负数的高位均补0,正数不断向右移动的最小值是0,而负数不断向右移动的最小值是1(想了很久为什么负数不断向右移动最终的最小值会是1)
为什么负数不断无符号向右移动的最小值是1?
比如35的补码是00100011,不断的右移,就会在最高位不断地补0,直到移动到8位全为0为止,这看起来挺好理解的。
那如果是负数呢?
如果有一个32位的整型负数,可以知道它的最高位为1,但是根据无符号位移运算的规则,不断地向右移动,空位补0,那么该负数的最小值也应该为0呀,对不起,我想错了。因为在实际的编程中,整型数上移动的位数是字长的整数倍时,无论是否带符号以及移动方向,均为本身。因为移动的位数是mod32,比如一个32位的整型数,右移1位就等价于移动1位,但是右移33就可以计算成33mod32 = 1,因此还是移动1位,如果向右移动32,则可以计算成32 mod 32 = 0等价于没有移动,所以可以得出负数不断的向右移动最小值为1(最右边的一个1),64位的长整型同理。
输入:
输出: