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

 

posted @   风铃如沧海  阅读(290)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示