Java 位运算符
位运算符
Java 位运算提供了 与
、或
、异或
、非
、移位
这几个功能,除了 非
是一元操作,其他都是二元操作
具体运算符看下表
运算符 | 名称 | 功能简述 |
---|---|---|
& | 与 | 按位与 |
| | 或 | 按位或 |
^ | 异或 | 按位异或 |
~ | 非 | 取反 |
>> | 算术右移动 | 低位溢出,符号位不变 |
<< | 算术左移动 | 符号位不变,低位补 0 |
>>> | 逻辑右移/无符号右移 | 低位溢出,高位补 0 |
以上运算符分为两组学习,先学习&
、|
、^
、~
,再学习 位移
。
第一组
与
、或
、异或
、非
的概念在前面学习 关系运算符
的时候已经学过了,这里的概念一样。
如:与
只有当两位数同时为 1
才返回 1
,否则返回 0
(这里概念套用不再说了)
代码例子:
// 先上最简单的取反,取反弄明白了后面的就更简单了
int number = ~13;
位运算的过程前面原码、反码、补码
那一章已经说过了,不再赘述。
直接上运算过程图:
从上图就是完整的运算过程
- 位运算,会先把所有的数值转换成对应的原码
- 再把原码转成反码
- 在将反码转成补码才能执行运算(所有运算过程都使用补码方式运算)[因为正数 原码、反码、补码一样,所以正数能直接以补码方式进行运算,无需转换]
- 执行完运算得到的结果并不是真正的结果,它还是补码,需要将补码转成反码
- 再将反码转成对应的原码
再来几个例子,就不上图了直接上代码。
例子 1:
int num = 9 & 23;
/*
运算推导过程
1. 得到 9 的原码 00000000 00000000 00000000 00001001
2. 得到 23的原码 00000000 00000000 00000000 00010111
3. 都是 ... 正数 00000000 00000000 00000000 00000001
可以直接进行&运算(为了对齐容易看我换行了)
4. 运算结果是正数,无需转换(正数的原码就是正树本身) 所以结果是 1
*/
// num 结果 = 1
例子 2:
int num = 3 & -9;
/*
运算推导过程
1. 得到 3 的原码 00000000 00000000 00000000 00000011
2. 得到 -9的原码 10000000 00000000 00000000 00001001 (这里 -9 符号位是 1 需要先将 -9 原码转成补码)
3. -9 原码转反码 11111111 11111111 11111111 11110110 [原码=>反码:符号位不变其他取反] (要得到补码就得先得到反码)
4. -9 反码转补码 11111111 11111111 11111111 11110111 [反码=>补码:反码 +1]
5. 执行3&-9 运算 00000000 00000000 00000000 00000011 (3 的补码)
............... 11111111 11111111 11111111 11110111 (-9 的补码)
............... 00000000 00000000 00000000 00000011 & 运算结果
6. 运算结果是正数,无需转换(正数的原码就是正树本身) 所以结果是 3
*/
其他运算符按照规则进行运算就行了
小结
与
、或
、异或
、非
运算的难点主要在负数 原码转补码,和补码转原码这里
如果不明白多看几遍图一,图一是完整的转换过程。
实际转换时,正数原码、反码、补码无需转换,因为它们三个都是一样的。
位移
算术左移
规则:符号位不变,低位补 0
比较简单直接上分析案例:
int num = 2 << 3;
/*
2 的二进制 00000000 00000000 00000000 00000010
运行左移3位 00000000 00000000 00000000 00010000
运行 结果 = 16
*/
算术左移,本质就是 被移的值 * 2^移动值次方
套用到上面的例子就是 2 * 2^3
int num = 5 << 8;
就是 5 * 2^8
算术右移
规则:低位溢出,符号位不变
案例:
int num = 2 >> 3;
/*
2 的二进制 00000000 00000000 00000000 00000010
运行右移3位 00000000 00000000 00000000 00000000
运行结果:0
*/
本质就是 被移数值/2^移动值次方
逻辑号右移
规则:低位溢出,高位补 0
案例:
int num = 123 >>> 3;
/*
123 的二进制 00000000 00000000 00000000 01111011
运行逻辑右移 00000000 00000000 00000000 00001111
运行结果:15
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具