Java 中位移运算符 >>,>>>,<<

 

 Java 中的三种位移运算符

java中有三种移位运算符

<<      :     左移运算符,num << 1,相当于num乘以2

>>      :     右移运算符,num >> 1,相当于num除以2

>>>    :     无符号右移,忽略符号位,空位都以0补齐

下面将使用代码进行测试:这里涉及到码的表示:原码、反码、补码、移码

原码:最高位表示符号位,剩余位表示数字,0表示正数,1表示负数

反码:正数的反码等于原码,负数符号为不变,剩余位取反

补码:一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,去到反码然后加1
移码:补码符号位取反

例如:表示10的这个数字(8位)

原码:0000 1010 

反码:0000 1010

补码:0000 1010

移码:1000 1010

例如:表示数字 -10

原码:1000 1010 

反码:1111  0101

补码:1111  0110

移码:0111  0110

例如:

public class MainTest {

  //用于输出数字本身与其二进制数字
public static void printBinary(int num){ System.out.println(num); System.out.println(Integer.toBinaryString(num)); } public static void main(String[] args){ int num = -7774; //输出 num 的二进制位数 printBinary(num); //num 向右移动2位并输出 num =num >> 2; printBinary(num); //无符号右移 num =num>>>2; printBinary(num); } }

其结构如下:

-7774
11111111111111111110000110100010
-1944
11111111111111111111100001101000
1073741338
111111111111111111111000011010

这个数据市为了更明显的现实位移设计的,-7774向右移动2位,相当于处于4

当-7774 无符号向右移动2位,首位补0,会改变原值,结果实际如下,0系统会不显示

00111111111111111111111000011010

但是,当 - 7774 改为 7774 结果如何???

7774
1111001011110
1943
11110010111
485
111100101

最后无符号移动:负数与原值没有关系,正数符合除以 4 点特点

但是 发现右移运算符点结果:

负数:-1994

正数:1993 

原文地址:https://www.cnblogs.com/bytecodebuffer/p/10188758.html