java位移运算符“<<”,“>>”,“>>>”详解

原创
2020/05/11 22:22
阅读数 79

1.java左移运算符“<<”: n<<m就是将整数n的二进制向左移动m位,高位舍弃,低位补0 这里以int类型整数5<<2为列,int类型占4个字节,即32比特,在计算即中表示为32位,第一位为符号位,0表示正数,1表示负数,所以int类型表示的范围(-2^31~2^31-1即:-2147483648~2147483467)。 负数在计算机中是以补码形式存在的,负数的补码=反码+1,负数的反码为符号位不变,其他位取反。补码的补码即为原码,这有点类似负负得正,故对负数求补码即可得到原码。 5的二进制为:00000000 00000000 00000000 00000101 5<<2的结果为:00000000 00000000 00000000 00010100 5<<29的结果为:10100000 00000000 00000000 00000000 5<<29的反码为:11011111 11111111 11111111 11111111 5<<29的补码为:11100000 00000000 00000000 00000000 5<<2转化为十进制为:20 5<<29转化为十进制为:-1,610,612,736

-5的二进制原码为:100000000 00000000 00000000 00000101 很容易得出补码为:111111111 11111111 11111111 11111011 -5<<2的结果为:111111111 11111111 11111111 11101100 -5<<2的原码为:100000000 00000000 00000000 00010100 -5<<2转化十进制为:-20 -5<<29的结果为:011000000 00000000 00000000 00000000 -5<<29十进制结果为:1,610,612,736

由以上可以的出结论,负数左移可以变成正数,正数左移可以变成负数,在数字没有溢出的前提下,n<<m的数学意义等同于n*2^m。

2.java带符号右移运算符">>": n>>m就是在高位补m个符号位,低位舍弃 5的二进制为:00000000 00000000 00000000 00000101 5>>1的结果为:00000000 00000000 00000000 00000010 5>>1十进制为:2

-5的二进制原码为:100000000 00000000 00000000 00000101 很容易得出补码为:111111111 11111111 11111111 11111011 -5>>1的结果为:111111111 11111111 11111111 11111101 -5>>1的原码为:100000000 00000000 00000000 00000011 -5>>1十进制为:-3

n>>m的数学意义为n/2^m向下取整

3.java无符号右移运算符">>>": n>>>m就是在高位补m个0,低位舍弃,对于正数来说它等同于n>>m,对于负数来说可以通过无符号右移变成正数

总结:对于int类型来说,单移动位数超过31位,则实际移动位数为:m%32,列如5<<35 = 5<<3

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部