当前位置: 代码网 > it编程>编程语言>Java > Java位运算左移右移详解:原码反码补码与无符号右移的区别

Java位运算左移右移详解:原码反码补码与无符号右移的区别

2026年07月24日 Java 我要评论
为什么没有无符号左移呢?在计算机中,位运算中左移跟符号没有关系的,因为最高位就是符号位。例如8位的byte中最高位如果是1那就表示负数。如果是左移一位,那么最高位就会丢掉,最低位补0。例如:1111

为什么没有无符号左移呢?

在计算机中,位运算中左移跟符号没有关系的,因为最高位就是符号位。

例如8位的byte中最高位如果是1那就表示负数。如果是左移一位,那么最高位就会丢掉,最低位补0。

例如:1111 1111 << 1 就会变成 1111 1110。因此,不仅是java,任何语言都没有无符号左移运算符。

位操作操作的是原码、反码还是补码?

原码、反码和补码都是用来表示数字的编码方式。

  • 原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。例如,如果是8位二进制,那么+1的原码为0000 0001,-1的原码为1000 00011。
  • 反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余各个位取反。例如,+1的反码为0000 0001,-1的反码为1111 11101。
  • 补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。例如,+1的补码为0000 0001,-1的补码为1111 11111。

计算机内部使用补码来存储数字。这样做可以简化计算机底层电路设计,并且可以多表示一个最低数。例如,在8位二进制中,使用原码或反码表示时范围为[-127, +127],而使用补码表示时范围为[-128, +127]。

左移 <<

将一个数对应的二进制表示整体左移,不考虑符号位,左边超出的部分舍弃,右边补零。

正数

以数字10为例,二进制表示为

00000000 00000000 00000000 00001010

第一位为符号位,0表示正数,1表示负数。左移1位之后为

00000000 00000000 00000000 00010100

十进制表示为20,相当于乘以2。hashmap扩容时将新容量增加为原来容量的两倍,就是使用左移实现的。

负数

以负数-10为例,二进制表示为

1111 1111 1111 1111 1111 1111 1111 0110

左移1位结果为

1111 1111 1111 1111 1111 1111 11110 1100

十进制为-20,也是相当于乘以2。

右移 >>

将一个数对应的二进制表示整体右移,考虑符号位,左边的用原有符号位补充,右边超出的部分舍弃。

正数

以10为例

00000000 00000000 00000000 00001010

右移1位

00000000 00000000 00000000 00000101

十进制表示为5,相当于除以2。arraylist扩容时将新容量增加为原来的1.5倍,就是使用右移实现的。

负数

以负数-10为例

1111 1111 1111 1111 1111 1111 1111 0110

右移1位

1111 1111 1111 1111 1111 1111 1111 1011

十进制表示为-5,也是相当于除以2。

无符号右移 >>>

将一个数的二进制表示整体右移,不考虑符号位,左边部分总是以0填充,右边部分舍弃。

正数

和上面的右移一致。

负数

以-10为例

1111 1111 1111 1111 1111 1111 1111 0110

无符号右移1位

01111 1111 1111 1111 1111 1111 1111 1011

十进制表示为2147483643。hashmap中在求一个数最接近的2的n次幂时使用到了无符号右移。

超过32位的左移会怎样?

如果一个int型数字左移超过32位,如33位,相当于左移1位,右移、无符号右移同理。

a << n == a << (n % 32)

位移是一个取模的过程

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com