title:Java移位符
date:2017年11月12日21:58:00
java中有三种移位运算符
<< : 左移运算符,num << 1,相当于num乘以2 ,
>> : 右移运算符,num >> 1,相当于num除以2,对于正数,高位补0,对于负数,高位补1
>>> : 无符号右移,忽略符号位,空位都以0补齐
在介绍移位运算符之前,我们有必要讲一些计算机的基础知识:计算机中的原码、补码和反码
原码:
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值.
反码:
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
Java移位运算符使用实例
我们来编写一个例子来分析Java移位运算符
package com.wangcc.MyJavaSE;
public class ShiftingTest {
public static void main(String[] args) {
int num1 = -3;
printInfo(num1);
num1 = num1 >> 1;
printInfo(num1);
}
private static void printInfo(int num) {
System.out.println(Integer.toBinaryString(num));
}
}
输出:
11111111111111111111111111111101
11111111111111111111111111111110
首先,我们要知道在计算机中负数是用补码表示的,我们来证实这一点。
我们来计算下-3的补码。
首先,我们得到-3的原码。我们知道在Java中,int类型是32位的,所以原码:
10000000000000000000000000000011
反码,符号位不变,其他为均取反:
11111111111111111111111111111100
补码:反码+1
11111111111111111111111111111101
很明显和第一行输出是一致的。
然后第二行的输出是通过num1>>1操作之后得到的,>>1代表右移一位(>>2自然就表示右移两位)
右移运算符作用到负数时,采取的是高位补1的方式。所以得到的是
11111111111111111111111111111110
我们将num1>>1改成num1>>>2继续测试。
先我们按照无符号右移的高位补0
得到结果:
00111111111111111111111111111111
我们运行程序
11111111111111111111111111111101
111111111111111111111111111111
和我们的预期是一样的。