• 按位与:&
  • 按位或:|
  • 异或:^
  • 有符号移位:>>、<<
  • 无符号移位:>>>、<<<
  • 按位非:~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    /**
* 测试按位与、按位或、异或、移位、按位非
*/
@Test
public void testYiWei() {
int i = 3; //对应二进制 ...11
int j = 2; //对应二进制 ...10
int k = -3; //对应二进制 10000000 00000000 00000000 00000011(原码)

//按位与& 从高位开始两个都为1 为1,否则 为0
System.out.println(i & j); //10(2进制) -> 2(10进制)

//按位或| 从高位开始只要1个为1 为1,否则 为0
System.out.println(i | j); //11(2进制) -> 3(10进制)

//异或^= 从高位开始相同为0,否则 为1
System.out.println(i ^ j); //01(2进制) -> 1(10进制)

//左移位<<1 向左移位1位,最低位补0,原来的第二高位现在成为最高位
System.out.println(i << 1); //0011 移位后 0110,对应10进制的6

//右移位>>1 向右移位1位,最高位补上符号位,且不变
/*
移位前 11111111 11111111 11111111 11111101(补码)
移位后 11111111 11111111 11111111 11111110(补码),
对应原码 10000000 00000000 00000000 00000010
*/
System.out.println(k >> 1); //-2(10进制)

//无视符号右移位>>>1 向右移位1位,最高位补上0
/*
移位前 11111111 11111111 11111111 11111101(补码)
移位后 01111111 11111111 11111111 11111110(补码),
对应原码 01111111 11111111 11111111 11111110
*/
System.out.println(k >>> 1); //2147483646即2^31-1-1(10进制)

/*
按位非的流程:
00000000 00000000 00000000 00000010 1.2的2进制(这里是补码,因为是正数,所以和原码一样)
11111111 11111111 11111111 11111101 2.位非
11111111 11111111 11111111 11111100 3.取原码 (-1)
10000000 00000000 00000000 00000011 3.取原码 (取反)
*/
System.out.println(~j); //-3(10进制)
}

复制代码

转载自:https://www.cnblogs.com/lujiannt/p/9242297.html