news 2026/5/3 23:02:29

java-位运算

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java-位运算

位运算符是对操作数以二进制比特为单位进行的操作和运算,位运算数的运算对象只能是整型和字符型,结果为整型。

位运算就是将参与运算的数据转换成2进制的补码后计算的,计算后在回到原码,转换为10进制

原码反码和补码:

10进制与2进制的转换 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 2. 反码 反码的表示方法是: 正数的反码是其本身【原码】 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反. 3. 补码 补码的表示方法是: 正数的补码就是其本身【原码】 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1) 整数的2进制就是源码 负数的2进制实质上补码表示。 -3 => 10000011—>11111100—>11111101【负数的原码取反+1】{符号位不变} -3 => 00000011【3】—>11111100【取反】—>11111101【+1】 【负数的绝对值的原码的取反+1】 -7 => 00000111【7】—>11111000【取反】—>11111001【+1】 -12 => 00001100【12】—>11110011【取反】—>11110100【+1】

下表列出了位运算符的基本运算:

1.与或非计算

举例:前四种,使用正数举例,负数的话需要使用补码

位运算(计算机基础学过) A = 0011 1100 B = 0000 1101 A & B = 0000 1100(两个都是1才是1) A | B = 0011 1101(有1个1就是1) A ^ B = 0011 0001(相同为0,不同为1) ~ B = 1111 0010 ~ A =1100 0011

java代码测试:

@Test public void test1() { // 十进制A的二进制为0011 1100 // 十进制B的二进制为0000 1101 int A = 60; int B = 13; System.out.println("=====================与操作====================="); // 进行与操作 System.out.println(A & B); // 12 // 转换为二进制 System.out.println(Integer.toBinaryString(A & B)); // 0000 1100 System.out.println("=====================与操作====================="); System.out.println("=====================或操作====================="); // 进行或操作 System.out.println(A | B); // 61 System.out.println(Integer.toBinaryString(A | B)); // 0011 1101 System.out.println("=====================或操作====================="); System.out.println("=====================非操作====================="); // 进行非操作 System.out.println(~A); // -61 System.out.println(Integer.toBinaryString(~A)); // 11111111111111111111111111000011 System.out.println(~B); // -14 System.out.println(Integer.toBinaryString(~B)); // 11111111111111111111111111110010 System.out.println("=====================非操作====================="); System.out.println("=====================异或操作====================="); // 进行异或操作 System.out.println(A ^ B); // 49 System.out.println(Integer.toBinaryString(A ^ B)); // 0011 0001 System.out.println("=====================异或操作====================="); }

结果:

2.正数左移

首先位运算是对补码进行操作的,但是因为正数的补码就是原码本身,所以这里直接对原码进行操作。

左移:

/** * 正数左移 */ @Test public void test2() { // 十进制A的二进制为0011 1100 int A = 60; int W = A << 3; System.out.println(W); // 480 System.out.println(Integer.toBinaryString(W)); // 111100000 }

分析:
在java里,int类型是4字节32位的也就是说,A的完整比特位为:

0000 0000 0000 0000 0000 0000 0011 1100

这时候A左移3位,可以理解为0011 1100往左边移动覆盖了三位,右边补三个0,结果就是:

0000 0000 0000 0000 0000 0001 1110 0000

转换为十进制也就是480.

3.正数右移

/** * 正数右移,正数的无符号右移和普通右移结果是一样的。 */ @Test public void test3() { // 十进制A的二进制为0011 1100 int A = 60; int W = A >> 3; System.out.println(W); // 7 System.out.println(Integer.toBinaryString(W)); // 0000 0111 }

和左移一样,32位比特位位:

0000 0000 0000 0000 0000 0000 0011 1100

右移三位,就是将右边的往右剔除三位,左边补0。

0000 0000 0000 0000 0000 0000 0000 0111

转换为十进制就是7.

4.正数无符号右移

正数有符号右移和无符号右移没区别

5.负数的左移

/** * 负数左移 */ @Test public void test4() { // -60的二进制原码为1011 1100,其反码位1100 0011,补码为1100 0100 int A = -60; int W = A << 3; System.out.println(W); System.out.println(Integer.toBinaryString(W)); }

A的二进制原码为1011 1100,在java里是32位的,所以第一位为1,其原码为

1000 0000 0000 0000 0000 0000 0011 1100

反码:

1111 1111 1111 1111 1111 1111 1100 0011

补码为:

1111 1111 1111 1111 1111 1111 1100 0100

左移三位,结果为:

1111 1111 1111 1111 1111 1110 0010 0000

这是补码的形式,换为反码:

1111 1111 1111 1111 1111 1000 01111 1111

换位原码:

1000 0000 0000 0000 0000 0111 10000 0000

数值部分是11110000000,转换为十进制加上符号为-480。

6.负数的右移

@Test public void test5() { // -60的二进制原码为1011 1100,其反码位1100 0011,补码为1100 0100 int A = -60; int W = A >> 3; System.out.println(W); // System.out.println(Integer.toBinaryString(W)); // }

补码为:

1111 1111 1111 1111 1111 1111 1100 0100

右移3位:

1111 1111 1111 1111 1111 1111 1111 1000

-1转换位反码:

1111 1111 1111 1111 1111 1111 1111 0111

取反得到原码:

1000 0000 0000 0000 0000 0000 0000 1000

1000转换为十进制加上符号位结果就是-8。

7.负数的无符号右移

它的核心规则非常简单:无论正数还是负数,右移后左边空出的高位,一律补 0

@Test public void test6() { // -60的二进制原码为1011 1100,其反码位1100 0011,补码为1100 0100 int A = -60; int W = A >>> 3; System.out.println(W); // System.out.println(Integer.toBinaryString(W)); // }

其补码为:

1111 1111 1111 1111 1111 1111 1100 0100

无符号右移3位的话:

0001 1111 1111 1111 1111 1111 1111 1000

由于最高位(符号位)变成了0,这意味着移位后的结果是一个正数

在计算机中,正数的原码、反码、补码都是相同的。因此,我们不需要像处理负数那样进行“减一取反”的操作,直接将其转换为十进制即可。

8.应用场景

目前就我接触到的业务里,也就和plc通信的时候需要使用到位运算,其他地方几乎不用,尽管日常业务开发可以不用,但必须理解,因为很多优秀源码(如 ThreadPoolExecutor、HashMap)离不开位运算。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 22:59:21

故障预警准确率提升68%的关键技巧,深度拆解LSTM+Prophet融合预测架构

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;故障预警准确率提升68%的关键技巧&#xff0c;深度拆解LSTMProphet融合预测架构 在工业IoT与云原生运维场景中&#xff0c;单一时间序列模型难以兼顾长期趋势建模与短期突发波动捕捉。LSTM擅长学习非线…

作者头像 李华
网站建设 2026/5/3 22:55:34

从硬件决策哲学到生态竞争壁垒

本文内容整理自相关技术讨论与问答记录&#xff0c;仅作为个人学习笔记存档。一、芯片设计的核心困境&#xff1a;必须押注"市场赢家" 1.1 硬件与软件的本质差异 芯片从需求分析到产品落地通常需要两年时间。在此期间&#xff0c;软件、应用、市场的任何"变心&q…

作者头像 李华
网站建设 2026/5/3 22:48:56

终极指南:如何在5分钟内掌握MapleStory WZ文件编辑与地图制作

终极指南&#xff1a;如何在5分钟内掌握MapleStory WZ文件编辑与地图制作 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected 你是否曾梦想过修改…

作者头像 李华
网站建设 2026/5/3 22:45:32

3步掌握B站视频下载神器:小白也能轻松获取无水印高清视频

3步掌握B站视频下载神器&#xff1a;小白也能轻松获取无水印高清视频 【免费下载链接】BiliDownload B站视频下载工具 项目地址: https://gitcode.com/gh_mirrors/bil/BiliDownload 你是否曾在B站看到精彩的教学视频想要离线学习&#xff0c;或是遇到动人的音乐MV希望永…

作者头像 李华
网站建设 2026/5/3 22:43:48

法律智能问答系统RAG技术优化实践

1. 法律智能问答系统的技术挑战在法律行业数字化转型的浪潮中&#xff0c;基于检索增强生成&#xff08;RAG&#xff09;技术的智能问答系统正成为律所和法务部门的重要工具。这类系统需要同时处理法律条文精确性和案例复杂性的双重挑战——既要从海量法规库中准确抓取相关条款…

作者头像 李华