Java 位运算符

位运算符

Java 位运算提供了 异或移位 这几个功能,除了 是一元操作,其他都是二元操作

具体运算符看下表

运算符 名称 功能简述
& 按位与
| 按位或
^ 异或 按位异或
~ 取反
>> 算术右移动 低位溢出,符号位不变
<< 算术左移动 符号位不变,低位补 0
>>> 逻辑右移/无符号右移 低位溢出,高位补 0

以上运算符分为两组学习,先学习&|^~,再学习 位移

第一组

异或 的概念在前面学习 关系运算符 的时候已经学过了,这里的概念一样。

如: 只有当两位数同时为 1 才返回 1,否则返回 0 (这里概念套用不再说了)

代码例子:

// 先上最简单的取反,取反弄明白了后面的就更简单了
int number = ~13;

位运算的过程前面原码、反码、补码 那一章已经说过了,不再赘述。

直接上运算过程图:

image-20220409022339490

从上图就是完整的运算过程

  1. 位运算,会先把所有的数值转换成对应的原码
  2. 再把原码转成反码
  3. 在将反码转成补码才能执行运算(所有运算过程都使用补码方式运算)[因为正数 原码、反码、补码一样,所以正数能直接以补码方式进行运算,无需转换]
  4. 执行完运算得到的结果并不是真正的结果,它还是补码,需要将补码转成反码
  5. 再将反码转成对应的原码

再来几个例子,就不上图了直接上代码。

例子 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
*/

其他运算符按照规则进行运算就行了

小结

异或 运算的难点主要在负数 原码转补码,和补码转原码这里

如果不明白多看几遍图一,图一是完整的转换过程。

image-20220409030031819

实际转换时,正数原码、反码、补码无需转换,因为它们三个都是一样的。

位移

算术左移

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