概述

上一篇文章我们说到了Java运算符的优先级的问题,也给大家提供了一个简单易记的口诀,那么这一篇博文,我们就来看一看Java运算符中的位运算符:左移,右移,无符号右移。程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。

package test;

public class Test24 {
    public static void main(String[] args){
        System.out.println(Integer.toBinaryString(-7));//将整型-7转化为二进制形式显示
        System.out.println(7>>2);//将整型7右移2位
        System.out.println(7>>>2);//将整型7无符号右移2位
        System.out.println(-7>>2);//将整型-7右移两位
        System.out.println(-7>>>2);//将整型-7无符号右移两位
        System.out.println(7<<2);//将整型7左移移两位
        System.out.println(-7<<2);//将整型-7左移移两位
    }
}

结果为:

11111111111111111111111111111001
1
1
-2
1073741822
28
-28

解析:

7右移2位

00000000 00000000 00000000 00000111//7的二进制(不要告诉我你不知道为什么)
右移两位后
00000000 00000000 00000000 00000001//最左边用符号位填充
转换十进制为:
1

7无符号右移2位

00000000 00000000 00000000 00000111//7的二进制(不要告诉我你不知道为什么)
右移两位后
00000000 00000000 00000000 00000001//最左边用0填充
转换十进制为:
1

-7右移2位

11111111111111111111111111111001//-7的二进制
右移两位后
11111111111111111111111111111110//最左边用符号位填充
转换十进制为:
-2

-7无符号右移2位

11111111111111111111111111111001//-7的二进制
右移两位后
00111111111111111111111111111110//最左边用0填充
转换十进制为:
1073741822

7左移2位

00000000 00000000 00000000 00000111//7的二进制(不要告诉我你不知道为什么)
右移两位后
00000000 00000000 00000000 00011100//最右边用0填充
转换十进制为:
28

-7左移2位

11111111111111111111111111111001//-7的二进制
右移两位后
11111111111111111111111111100100//最左边用0填充
转换十进制为:
-28

总结:

右移时,位最左边用符号位填充(0为正,1为负),即负数用1填充,正数用0填充;无符号右移时,不管正负数都是用0填充;左移是最右边都是用0填充,不管正负数。

番外:

对二进制标示模糊的同学可以去了解一下原码,反码,补码基础知识。这样对你对以上二进制的表示理解有一定的帮助。当然,如果知道的话,代表同学你看到了最后,不妨污一下你的小手,在文章的左边给博主点个喜欢吧。