位运算符有七个,分为两类:
逻辑位运算符:位与(&)、位或(|)、位异或(^)、非位(~)
移位运算符:左移(<<)、右移(>>)、无符号右移(>>>)
1. 逻辑为运算符
主要包括:位与(&)、位或(|)、位异或(^)、非位(~)
1.1 位与(&)
参加运算的两个数据,按二进制位进行“与”运算。运算规则:同1为一,其余为0。
例:
3&5=1 即 0000 0011& 0000 0101 = 0000 0001
1.2 位或(|)
参加运算的两个对象,按二进制位进行“或”运算。运算规则:同0为0,有1为1。
例:
2|6=6 即 0000 0010 | 0000 0110 = 0000 0110
1.3 位异或(^)
参与运算的两个数据,按二进制位进行“异或”运算。运算规则:相同为0,不同为1。
例:
2^6=4 即 0000 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=20 即 0000 0101 << 2 = 0001 0100
(2^31 -2)<<2=-8
即
0111 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. 一些应用: