前言
咱们都晓得对于有符号数据类型,二进制最左端的数字为符号位,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×2n,算数左移(逻辑左移)
num>>n 相当于 num2n,算数右移
num>>>n 逻辑右移,当 num 为负数和算术右移一个效
@Test
public void test1() {// System.out.println(1<<1);
// System.out.println((float) (1>>1));
int num = 10;
System.out.println(Integer.toBinaryString(0));
System.out.println(Integer.toBinaryString(1));
System.out.println(Integer.toBinaryString(2));
System.out.println(Integer.toBinaryString(3));
System.out.println(Integer.toBinaryString(4));
System.out.println(Integer.toBinaryString(5));
System.out.println(Integer.toBinaryString(100));
System.out.println("-------------");
//System.out.println(Integer.toBinaryString(6));
System.out.println(Integer.toBinaryString(8));
System.out.println(Integer.toBinaryString(16));
System.out.println(Integer.toBinaryString(13));
System.out.println(Integer.toBinaryString(~13));
System.out.println("-------------");
System.out.println(Integer.toBinaryString(num));
System.out.println(Integer.toBinaryString(num << 1));
System.out.println(Integer.toBinaryString(num>>1));
System.out.println(Integer.toBinaryString(num>>2));
System.out.println(Integer.toBinaryString(num>>4));
System.out.println("---------------");
System.out.println(Integer.toBinaryString(2 & 3));
System.out.println(Integer.toBinaryString(2 | 3));
System.out.println(Integer.toBinaryString(~2));
System.out.println(Integer.toBinaryString(~3));
System.out.println("---------------");
System.out.println(200 & ~200);
System.out.println("---------------");
// 无符号右移运算符 >>> 只是对 32 位和 64 位的值有意义
System.out.println(Integer.toBinaryString(~2>>>4));
System.out.println(Integer.toBinaryString(~2>>>33));
// 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);
// result:
// 0
// 1
// 10
// 11
// 100
// 101
// 1100100
// -------------
// 1000
// 10000
// 1101
// 11111111111111111111111111110010
// -------------
// 1010
// 10100
// 101
// 10
// 0
// ---------------
// 10
// 11
// 11111111111111111111111111111101
// 11111111111111111111111111111100
// ---------------
// 0
// ---------------
// 1111111111111111111111111111
// 1111111111111111111111111111110
// 20
// -20
// 5
// -5
// 5
// 2147483643
}