C语言几道位移运算题
1 << -1
1 << -1是几多?
字面上看1左移-1位,好像是1右移1位的意思。
但实际功效却是-2147483648,而-2147483648 = – 2 31。
也就是说实际上1 << -1等同 于:
1 << 31
为什么?╮(╯_╰)╭没有什么为什么,就是这样界说的,可以说为了共同 Javascript中整型是32位的吧。
也就是说m << -n等同于:
m << (-n % 32 + 32)
在c语言中,这样写编译的时候会抛错的。
可是,Java中的这个式子的功效和Javascript中 沟通。精确的说是在运算数字为32位整形的时候。好比假如我们将数字改生长整形,其功效有差异了。
public class test{ public static void main(String[] args){ System.out.println(1L << -1); // -9223372036854775808 } }
那么1 >> -1呢?
左移负数位,好像是牢靠为0的。
无论哪个数来移,移几多 位都一样。
alert(1 >> -1) // 0
(1 << 31)为什么是负数
首先位移运算是基于补码的,所以先温习一下补码的常识。
正整数的补码就是其自己。
负整数 的补码是,其标记位稳定,数值部门的列位取反,然后整个数加1。
(32位整数-2147483648有些出格 ,其二进制暗示是-10000000000000000000000000000000,并且补码是10000000000000000000000000000000)
所以1的补码是00000000000000000000000000000001,左移31位就酿成了 10000000000000000000000000000000,即-2147483648。
(1 << 31) – 1是几多?
因为1 << 31是32位整形最小能暗示的数字,在Java中这个式子的功效是2147483647,也就是说溢出然后酿成 所能暗示的最大整数了。
但Javascript不太沟通,这个式子的功效是-2147483649,因为Javascript引 擎自动将其酿成64位浮点数来暗示了。
一道笔试题
-13 >> 2是几多?
讲了这么 多,这道题就很简朴了。
因为-1310是-11012,则补码是1111….0011,则右移2位则为1111…1100。 所以最后功效是-1002,即功效是-410。
我们也可以记着,右移1位操纵是除以2再向下取整。