前言
我们都知道对于有符号数据类型,二进制最左端的数字为符号位,0代表正,1代表负,这里先介绍几个概念
逻辑左移=算术左移:高位溢出,低位补0 逻辑右移:低位溢出,高位补0 算术右移:低位溢出,高位用符号位的值补
比如一个有符号位的8位二进制数10101010,[]是添加的数字
逻辑左移一位:0101010[0] 逻辑左移两位:101010[00]
算术左移一位:0101010[0] 算术左移两位:101010[00]
逻辑右移一位:[0]1010101 逻辑右移两位:[00]101010
算术右移一位:[1]1010101 算术右移两位:[11]101010
算术左移和算术右移主要用来进行有符号数的倍增、减半 逻辑左移和逻辑右移主要用来进行无符号数的倍增、减半
Java中是没有无符号数据类型的,C和C++中有
符号
例子
解释
<<
num<< n
算术左移
相当于 num*(2的n次方)
>>
num>>n
算术右移
相当于num/(2的n次方)
>>>
num>>>n
逻辑右移,当num为正数和算术右移一个效果
例子
public static void main(String[] args) {
// 20
System.out.println(10 << 1);
// -20
System.out.println(-10 << 1);
// 5
System.out.println(10 >> 1);
// -5
System.out.println(-10 >> 1);
// 5
System.out.println(10 >>> 1);
// 2147483643
System.out.println(-10 >>> 1);
}