博客
关于我
Java位运算,负数的二进制表示形式,int类型最大值为什么是2的31次方-1
阅读量:582 次
发布时间:2019-03-12

本文共 1641 字,大约阅读时间需要 5 分钟。

二进制中负数如何表示?

在计算机中,我们使用补码来表示数字,尤其是负数。这意味着所有数字的二进制表示中,最高位(即最左边的位)为标志位。标志位的值决定了数字的符号:0表示正数,1表示负数。这种统一的表示方式使得加法和减法操作可以统一处理。

各种码的定义

原码

  • 原码:正数的原码是其绝对值的二进制表示。
  • 反码:负数的反码是将正数的原码除去符号位(即最高位的1)后各位取反。
  • 补码
    • 正数的补码与原码相同。
    • 负数的补码是对其原码(除去符号位)进行各位取反后再加1。

补码的优势

补码能够简化加法和减法操作,使得减法可以转化为加法的形式,从而提高计算效率。由于补码的处理统一性,它在计算机中被广泛使用。


一个字节中的负数表示实例

以一个字节(8位)为例,分析如何用补码表示负数。

正数5的二进制表示

  • 原码:0000 0101
  • 反码:1111 1010
  • 补码:1111 1011

负数-5的二进制表示

  • 原码:1000 0101
  • 反码:1111 1010
  • 补码:1111 1011

如何计算-5的十进制值?

  • 先将补码(1111 1011)减去1,得到反码(1111 1010)。
  • 最后,将反码转换为十进制:-5。

所以,-5在二进制中的补码表示为:1111 1011


Java中的位运算

在Java中,位运算以&(与)、|(或)、~(非)、^(异或)为主要运算符。

按位运算示例

  • 与运算(&)

    • 两个位中有且仅有1,结果才为1。
    • 示例:9 & 8
      • 9的二进制:0000 1001
      • 8的二进制:0000 1000
      • 结果:8(二进制为:0000 1000)
  • 或运算(|)

    • 两个位中有且仅有1,则结果为1。
    • 示例:9 | 8
      • 结果:9(二进制为:0000 1001)
  • 非运算(~)

    • 将0变为1,1变为0。对于正数9:
      • 二进制:0000 1001
      • 非操作后:1111 0110
      • 这是一个负数,其补码为:1000 1010,对应十进制值为-10。
  • 异或运算(^)

    • 两个位不同时为1,结果为1。
    • 示例:9 ^ 8
      • 结果:1(二进制为:0000 001)

  • 移位运算

    在Java中,移位运算可以针对整数类型进行。移位后的高位丢弃,低位补零或1,具体取决于移位方向和数值符号。

    左移(<<)和右移(>>)示例

  • 左移(<<)

    • 8位移除后,二进制位全部左移,高位丢弃,低位补零。
    • 示例:9 << 2
      • 二进制:0000 1001 左移两位后:0010 0100
      • 十进制:36
  • 右移(>>)

    • 移位时若为正数,高位插入0;若为负数,高位插入1。
    • 示例:9 >> 2
      • 二进制:0000 1001 右移两位后:0000 0010
      • 十进制:2
  • 无符号右移(>>>)

    • 不论是正数还是负数,高位插入0。
    • 示例:9 >>> 2
      • 结果:2(二进制为:0000 0010)

  • int类型的取值范围

    • int类型占4个字节(32位),其二进制表示方式为:

      0000 0000 0000 0000 0000 0000 0000 0000 0000
    • 正数情况:二进制最高位为0,最大的数为:01111111 11111111 11111111 11111111,对应十进制数值为2^31 - 1

    • 负数情况:二进制最高位为1,最小的数为:10000000 00000000 00000000 00000001,对应十进制数值为-2^31

    • 零的表示:二进制下,只有一种表示形式:

      • 正数0:0000 0000 0000 0000 0000 0000 0000 0000
      • 负数0:1000 0000 0000 0000 0000 0000 0000 0000

    这里需要注意:-2^31并不是一个有效的补码,它通过10000000 00000000 00000000 00000001来表示。

    (补充说明:-2^31的二进制表示为:11111111 11111111 11111111 11111111,这也是Integer.MIN_VALUE。)

    转载地址:http://qvhtz.baihongyu.com/

    你可能感兴趣的文章
    leetcode——区域和检索
    查看>>
    msfvenom的使用&免杀&外网渗透
    查看>>
    HTTP/2 协议详解
    查看>>
    grafana改用https登录
    查看>>
    使用jenkins进行项目的自动构建部署
    查看>>
    使用MySQLTuner-perl对MySQL进行优化
    查看>>
    2018年3月最新的Ubuntu 16.04.4漏洞提权代码
    查看>>
    异或交换两个数的值
    查看>>
    使用python绘出常见函数
    查看>>
    Golang AES加密
    查看>>
    Puppet的一些奇技淫巧
    查看>>
    foreman源NO_PUBKEY 6F8600B9563278F6
    查看>>
    亚马逊aws文档语法错误
    查看>>
    什么是5G?居然有人用漫画把它讲得如此接地气!
    查看>>
    Spring cloud --分布式配置中心组件Spring Cloud Config
    查看>>