一 描述
<
>>:右移运算符(算术右移),如果数字为正数时,移位后在前面补0,为负数时,则在前面补1;
>>>:无符号右移运算符(逻辑右移),忽略符号,空位补0即可。
二 Demo分析
/**
* @Program:
* @Description: Java移位运算符Demo
* @Author: heykin
* @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