JAVA位运算符<<,>>,>>>,&,|,^,~(第7节)


JAVA的位运算符包括以下

& 与

| 或

^ 异或

~ 非(取反)

>> 右移

<< 左移

>>> 无符号右移

如何区分位运算符和逻辑运算符:

逻辑运算符左右连接的是布尔类型的操作数

位运算符左右连接的是具体的数值

举例逐个说明位运算符

PS:

整数的默认类型为int,int类型占4个字符,一个字符占8位;

所以十进制的1,二进制数为:00000000 00000000 00000000 00000001

1 左移  <<

3 << 2 = 12

3的二进制为
00000000 00000000 00000000 00000011 -->2
二进制位整体向左移动2位后,空缺位置用0填充,如下
000000 00000000 00000000 0000001100 -->12
故3 << 2 = 12

2 有符号右移 >>

6 >> 2 = 1

6的二进制为
00000000 00000000 00000000 00000110 -->6
二进制位整体向右移动2位后,空缺位置用0填充,如下
0000000000 00000000 00000000 000001 -->1
故6 >> 2 = 1

-6 >> 2 = -2

第一步,得到-6的二进制数
如何推导出负数的二进制数
已知正数6的二进制数如下:
00000000 00000000 00000000 00000110 -->6
取反
11111111 11111111 11111111 11111001 
+1
11111111 11111111 11111111 11111010 得到-6的二进制数

第二步,根据-6的二进制数移位
-6 >> 2,向右移动2位,空缺位用符号数填充,正数的符号数为0,负数的符号数为1
1111111111 11111111 11111111 111110 -->此为-6右移2位的二进制数

第三步,推导出-6右移2位的二进制数为十进制的哪个数字,得出结果
跟第一步的操作顺序相反
-1
1111111111 11111111 11111111 111101
取反
00000000 00000000 00000000 00000010 -->2
结果2加符号
-2
得出:-6 >> 2 = -2

3 无符号右移 >>>

-6 >>> 2 = 1073741822

第一步,得到-6的二进制数
已知正数6的二进制数如下:
00000000 00000000 00000000 00000110 -->6
取反
11111111 11111111 11111111 11111001 
+1
11111111 11111111 11111111 11111010 得到-6的二进制数

第二步,得到-6位移后的二进制数
-6 >>> 2,向右移动2位。因为无符号移位,空缺位用0填充
0011111111 11111111 11111111 111110 --> 1073741822
得出:-6 >>> 2 = 1073741822

4 与 &

6 & 3 = 2

00000000 00000000 00000000 00000110 -->6
00000000 00000000 00000000 00000011 -->3
-------------------------------------->&,两个都为1则为1,否则为0
00000000 00000000 00000000 00000010 -->2

5 或 |

6 | 3 = 7

00000000 00000000 00000000 00000110 -->6
00000000 00000000 00000000 00000011 -->3
-------------------------------------->|,两个有一个为1则为1,否则为0
00000000 00000000 00000000 00000111 -->7

6 异或 ^

6  ^ 3 = 5

00000000 00000000 00000000 00000110 -->6
00000000 00000000 00000000 00000011 -->3
-------------------------------------->^,两个不同则为1,相同为0
00000000 00000000 00000000 00000101 -->5

7 非(取反) ~

~6 = -7

00000000 00000000 00000000 00000110 -->6
-------------------------------------->~,取反,1变0,0变1
11111111 11111111 11111111 11111001 -->取反后的二进制数,确认为负数
转换为十进制:
-1
11111111 11111111 11111111 11111000
取反
00000000 00000000 00000000 00000111 --> 7
加符号-为:-7
得到:~6 = -7

8 证明为什么byte类型的取值范围为-128到127

byte类型,占1字节,8位,去掉符号位,只有7位可用,取值范围为2的7次方,即:

127 :01111111

-128: 10000000

10000000
-1
01111111
取反
10000000 -->2的7次方=128
加符号-为:-128

相关