“<<”
"<<"其实就是数字转化为二进制形式,左移,之后低位补0。且左移位数为32或者32的倍数时,执行该操作之后,数值不变。
举例子简单说明一下:
- 3<<30 00000000 00000000 00000000 00000011(3) ->11000000 00000000 00000000 00000000
- 3<<33 00000000 00000000 00000000 00000011(3) ->00000000 00000000 00000000 00000110(6)
负数的移动方式一样,转化为二进制时都是补码形式。
“>>”
">>"运算符在原始数为正数和负数的情况会有所不同。
继续举例子说明一下:
- 12>>2 00000000 00000000 00000000 00001100(12) ->00000000 00000000 00000000 00000011(3)
- 12>>6 00000000 00000000 00000000 00000000(12) ->00000000 00000000 00000000 00000000(0)
从上面的例子可以发现,对于正数来说,执行">>"操作右移后,会在左边补0,且在右移位数超出后,移出的bit并不会循环出现在最高位。 - -2147483648>>31 10000000 00000000 00000000 00000000(-2147483648) ->11111111 11111111 11111111 11111111(-1)
- -2147483648>>32 10000000 00000000 00000000 00000000(-2147483648) ->10000000 00000000 00000000 00000000(-2147483648)
上面的结果可以明显推断出,负数执行右移操作,会在左边补1。
上面的操作在实验时发现,无论是正数还是负数在右移32或者32的倍数位时,会出现与移位前相同的情况,移动其它位数时仍然满足上述规律(这里移动32或32的倍数位是因为这里是int类型,当然如果是long类型,那么应该是64或者64的倍数位了)。
“>>>”
">>>“这个与”>>"操作类似,唯一不同的地方就是,该操作无论正数、负数,左边都补0,也同样满足上面描述的32或32的倍数的情况。
版权声明:本文为qq_33898680原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。