Java移位运算符

3,080 阅读3分钟

一 描述

  1. <<:左移运算符,左移几位就补几个0;
  2. >>:右移运算符(算术右移),如果数字为正数时,移位后在前面补0,为负数时,则在前面补1;
  3. >>>:无符号右移运算符(逻辑右移),忽略符号,空位补0即可。

二 Demo分析

/**
 * @Program: 
 * @Description: Java移位运算符Demo
 * @Author: <a href="http://heykin.xyz">heykin</a>
 * @Create: 2019-01-05 14:29
 * @Since: 1.0
 **/
public class Test {

    public static void main(String[] args) {
        /** 正数演示 **/
        System.out.println("-----------------正数演示-----------------");
        int num = 7;
        System.out.println("原值(十进制):" + num + ";原值(二进制)" + Integer.toBinaryString(num));
        int tmp = num >> 1;
        System.out.println("右移1位(十进制):" + tmp + ";右移1位(二进制)" + Integer.toBinaryString(tmp));

        tmp = num >>> 1;
        System.out.println("无符号右移1位(十进制):" + tmp + ";无符号1位(二进制)" + Integer.toBinaryString(tmp));

        tmp = num << 1;
        System.out.println("左移1位(十进制):" + tmp + ";左移1位(二进制)" + Integer.toBinaryString(tmp));
        /** 正数演示 **/

        /** 负数演示 **/
        System.out.println("-----------------负数演示-----------------");
        num = -7;
        System.out.println("原值(十进制):" + num + ";原值(二进制)" + Integer.toBinaryString(num));
        tmp = num >> 1;
        System.out.println("右移1位(十进制):" + tmp + ";右移1位(二进制)" + Integer.toBinaryString(tmp));

        tmp = num >>> 1;
        System.out.println("无符号右移1位(十进制):" + tmp + ";无符号1位(二进制)" + Integer.toBinaryString(tmp));

        tmp = num << 1;
        System.out.println("左移1位(十进制):" + tmp + ";左移1位(二进制)" + Integer.toBinaryString(tmp));
        /** 负数演示 **/
    }

}

运行结果:

对输出结果补0对齐一下

正数  7
00000000 00000000 00000000 00000111  原值   
00000000 00000000 00000000 00000011  右移1位
00000000 00000000 00000000 00000011  无符号右移1位
00000000 00000000 00000000 00001110  左移1位
负数 -7(负数为正数的补码=正数的反码+1)
11111111 11111111 11111111 11111001  原值
11111111 11111111 11111111 11111100  右移1位
01111111 11111111 11111111 11111100  无符号右移1位
11111111 11111111 11111111 11110010  左移1位

可以看出,当要移位的数是正数时,右移和无符号右移的值是一样的,当移位的数是负数时,右移的后的值还是负数,无符号右移后的值则是正数。

另外在网上看到一个快速算出移位运算符结果的方法:

在不大于自身数值类型最大位数的移位时,一个数左移n位,就是将这个数乘以2的n次幂;一个数右移n位,就是将这个数除2的n次幂,然后取整。

比如int32位的(64位也是同样方法):

7 >> 1 = 7/2 取整为3

7<< 1 = 7*2 为14

如果移动位数超过了32位怎么办?把移位数和32取余数得到的数字套用即可:

如9 >> 67

1、先67对32取余,结果是3

2、然后9/8 得到结果为1