Java 位运行 ”<<“, “>>“, ”>>>“
java中有三种移位运算符
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
jdk版本:jdk1.8.0_201
话不多说,直接上代码:
/**
* TODO
*
* @author lxy
* @version 1.0
* @date 2021/2/25 8:39
*/
public class BitwiseTest {
public static void main(String[] args) {
final int number = -10;
final int number_1 = 10;
System.out.println("number = " +number);
//右移位 乘以2, 算数运算,保留符号位
System.out.println("number >> 1L = " + (number >> 1L));
//右移位 除以2, 算数运算,保留符号位
System.out.println("number << 1L = " + (number << 1L));
//无符号右移位,逻辑移位,高位以0补充,原来为复数移位后丢符号。
System.out.println("number <<< 1L = " + (number >>> 1L));
System.out.println();
System.out.println("number_1 = " +number_1);
//右移位 乘以2, 算数运算,保留符号位
System.out.println("number_1 >> 1L = " + (number_1 >> 1L) +" "+getBite((long) (number_1 >> 1L)));
//右移位 除以2, 算数运算,保留符号位
System.out.println("number_1 << 1L = " + (number_1 << 1L) +" "+getBite((long) (number_1 << 1L)));
//无符号右移位,逻辑移位,高位以0补充,原来为复数移位后丢符号。
System.out.println("number_1 <<< 1L = " + (number_1 >>> 1L) +" "+getBite((long) (number_1 >>> 1L)));
System.out.println();
/**
* 异或运算符
* 异或运算符是用符号“^”表示的,其运算规律是:
* 两个操作数的位中,相同则结果为0,不同则结果为1。
*
* @date 2021/2/25 9:23
* @return void
*/
System.out.println("number_1 = " +number_1);
System.out.println(1L+" "+getBite(1L));
//右移位 乘以2, 算数运算,保留符号位
System.out.println("1L ^ (number_1 >> -1L) = " + (1L ^ (number_1 >> 1L)) +" "+getBite((1L ^ (number_1 >> 1))));
//右移位 除以2, 算数运算,保留符号位
System.out.println("1L ^ (number_1 << -1L) = " + (1L ^ (number_1 << 1L)) +" "+getBite((1L ^ (number_1 << 1))));
//无符号右移位,逻辑移位,高位以0补充,原来为复数移位后丢符号。
System.out.println("1L ^ (number_1 <<< -1L) = " + (1L ^ (number_1 >>> 1L)) +" "+getBite((1L ^ (number_1 >>> 1))));
System.out.println();
System.out.println("number_1 = " +number_1);
//右移位 乘以2, 算数运算,保留符号位
System.out.println("-1L ^ (number_1 >> -1L) = " + (-1L ^ (number_1 >> -1L)) +" "+getBite((-1L ^ (number_1 >> -1L))));
//右移位 除以2, 算数运算,保留符号位
System.out.println("-1L ^ (number_1 << -1L) = " + (-1L ^ (number_1 << -1L)) +" "+getBite((-1L ^ (number_1 << -1L))));
//无符号右移位,逻辑移位,高位以0补充,原来为复数移位后丢符号。
System.out.println("-1L ^ (number_1 <<< -1L) = " + (-1L ^ (number_1 >>> -1L)) +" "+getBite((-1L ^ (number_1 >>> -1L))));
}
public static String getBite(Long bit){
return Long.toBinaryString(bit);
}
}
结果:
number = -10
number >> 1L = -5
number << 1L = -20
number <<< 1L = 2147483643
number_1 = 10
number_1 >> 1L = 5 101
number_1 << 1L = 20 10100
number_1 <<< 1L = 5 101
number_1 = 10
1 1
1L ^ (number_1 >> -1L) = 4 100
1L ^ (number_1 << -1L) = 21 10101
1L ^ (number_1 <<< -1L) = 4 100
number_1 = 10
-1L ^ (number_1 >> -1L) = -1 1111111111111111111111111111111111111111111111111111111111111111
-1L ^ (number_1 << -1L) = -1 1111111111111111111111111111111111111111111111111111111111111111
-1L ^ (number_1 <<< -1L) = -1 1111111111111111111111111111111111111111111111111111111111111111