前言
咱们都晓得对于有符号数据类型,二进制最左端的数字为符号位,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 }