位运算符(逻辑、移位)详解

位运算符有七个,分为两类:

逻辑位运算符:位与(&)、位或(|)、位异或(^)、非位(~)
移位运算符:左移(<<)、右移(>>)、无符号右移(>>>)

1. 逻辑为运算符

主要包括:位与(&)、位或(|)、位异或(^)、非位(~)

1.1 位与(&)

参加运算的两个数据,按二进制位进行“与”运算。运算规则:同1为一,其余为0

例:

3&5=10000 0011& 0000 0101 = 0000 0001

1.2 位或(|)

参加运算的两个对象,按二进制位进行“或”运算。运算规则:同0为0,有1为1

例:

2|6=60000 0010 | 0000 0110 = 0000 0110

1.3 位异或(^)

参与运算的两个数据,按二进制位进行“异或”运算。运算规则:相同为0,不同为1
例:

2^6=40000 0010 ^ 0000 0110 = 0000 0100

1.4 非位(~)

即按位取反,操作会翻转其每一位。运算规则:0变为1,1变为0

0=1,1=0

1.5 负数的逻辑运算:

负数按补码形式参加按位或运算,符号位也要参与运算。
例:

-2:原码:1000 0010,反码(符号位不变,其他位取反):1111 1101,补码:1111 1110
-2|6= 即:1111 1110 | 0000 0110 

2. 移位运算符

主要包括:左移(<<)、右移(>>)、无符号右移(>>>)

2.1 左移(<<)

符号左边是要进行左移运算的数,右边表示要移动的位数。运算规则:高位丢弃,低位补0
(byte、short会转成int,即32位进行移位操作)

相当于乘法,左移2位即x4
例:

5<<2=200000 0101 << 2 = 0001 0100
(2^31 -2)<<2=-80111 1111 1111 1111 1111 1111 1111 1110 << 2 
= 1111 1111 1111 1111 1111 1111 1111 1000(补码)
= 1111 1111 1111 1111 1111 1111 1111 0111(反码)
= 1000 0000 0000 0000 0000 0000 0000 1000(原码)
= -8

2.2 右移(>>)

符号左边是要进行左移运算的数,右边表示要移动的位数。运算规则:正数左补0,负数左补1

相当于除法,右移2位即除以4

例:

5>>2=1 即:0000 0101 >> 2 = 0000 0001
-3>>2=-1
即:(这里就用8位表示,实际是32位)
1000 0011 >>2 = 1111 1100>>2 = 1111 1101>>2 = 1111 1111= 1111 1110= 1000 0001= -1

2.3 无符号右移(>>>)

即右移之后,无论该数为正还是为负,右移之后左补0。

正数和右移一样,
负数:

-3>>>2 = 1073741823 ,不做演示

3. 一些应用:

位运算符(逻辑、移位)详解_第1张图片
位运算符(逻辑、移位)详解_第2张图片

你可能感兴趣的:(java基础,java)