java int类型二进制 原码 反码 补码 的通过 & | ~ ^ 计算细致解析

本文深入解析Java中二进制计算的原理,包括原码、反码、补码的概念及转换,通过具体实例演示正负数的二进制表示,并讲解如何使用&|~^等位运算符进行计算,最后总结Java中二进制计算的特点。

1、基础概念

        原码:程序猿理理解的二进制码

        反码:认为规定的,除了第一位正负标志位以外取反的二进制码

        补码:计算机中实际操作的二进制吗

2、举例说明

      正数 和 负数 的反码和补码的的获取方式是不一样的,根据java的int类型说明。int是32位的。

      正数  2  ,正数的 原码、反码、补码一样。

      原码:0000 0000 0000 0000 0000 0000 0000 0010

      反码:0000 0000 0000 0000 0000 0000 0000 0010

      补码:0000 0000 0000 0000 0000 0000 0000 0010

      负数 2  ,第一位是标志位,0代表正数,1代表负数。

      原码:1000 0000 0000 0000 0000 0000 0000 0010

      反码:0111 1111 1111 1111 11111 11111 1111 1101   //除了最高位的标志位不变,其余的取反

      补码:0111 1111 1111 1111 11111 11111 1111 1110    //反码+1

3、通过& | ~ ^计算深入理解

      &:与运算,同时为1结果是1,否则是0.   eg:   1 & 1 = 1     1 & 0 = 0

      |: 或运算,有一个为1结果是1,否则是0.   eg:   1 | 1 = 1     1 | 0 =1   0 | 0=0

      ^: 异或运算,两个一样结果是1,否则是0.   eg:   1 ^1 = 0     1 ^0 =1   0 ^ 0=0

      (1)计算 38 & 37    38 | 37  38 ^ 37

           38 对应的二进制      0000 0000 0000 0000 0000 0000 0010 0110   

           37 对应的二进制      0000 0000 0000 0000 0000 0000 0010 0101

           &后结果36               0000 0000 0000 0000 0000 0000 0010 0100

            |后结果39                0000 0000 0000 0000 0000 0000 0010 0111

            ^后结果3                 0000 0000 0000 0000 0000 0000 0000 0011

           上面计算的都是正数,所以原码、反码、补码都一样,所以不易要认为全部都不易用原码计算,一定要记住,计算机操作都是计算       补码的。

      (2)计算 38 & -37

           38 原码、反码、补码都一样

          38          0000 0000 0000 0000 0000 0000 0010 0110 

         -37 原码 1000 0000 0000 0000 0000 0000 0010 0101

         -37 反码 1111 1111 1111 1111 1111 1111 1101 1010      //除了最高位 其余的取反

         -37 补码 1111 1111 1111 1111 1111 1111 1101 1011      //反码+1

            用补码计算 38 & -37  其实是

            0000 0000 0000 0000 0000 0000 0010 0110

            &

            1111 1111 1111 1111 1111 1111 1101 1011

             =

             0000 0000 0000 0000 0000 0000 0000 0010

            转换成十进制 2

          (3)~ 非运算的计算

                  计算   ~2

                  2的原码补码反码都一样

                 2的补码   0000 0000 0000 0000 0000 0000 0000 0010 

                      取反    1111 1111 1111 1111 1111 1111 1111 1101

                  取反之后 最高位是1 代表的是负数,所以这个二进制是一个负数的补码,计算出原码,首先负数看怎么计算得到补码。

                  一、原码 除了 最高的 标志位 其他为取反得到反码。

                  二、反码 +1 位 得到补码。

                 倒着推,补码-1位,得到反码

                       反码 :1111 1111 1111 1111 1111 1111 1111 1100

                 除了最高位其他取反得原码

                       原码 :1000 0000 0000 0000 0000 0000 0000 0011

                      十进制是  -3

4、总结

     (1)、java二进制计算用的都是补码。

     (2)、正数的原码、反码、补码相同。

     (3)、负数的反码是原码除最高位的取反,补码是反码+1

记过上面的计算已经很清晰了,大家考虑下在java中可以有哪些应用?

 

 

 

 

### 二进制原码反码补码计算方法 #### 原码 原码是最简单的表示方式,最高位作为符号位,“0”代表正“1”代表负,其余部分为值绝对值的二进制形式。例如: - 正 `+5` 的原码为 `00000101`(假设字长为8位)。 - 负 `-5` 的原码为 `10000101`。 需要注意的是,在某些特殊情况下,如 `-0` 和 `+0` 都存在不同的编码[^1]。 #### 反码 反码是对原码的一种转换形式,其定义如下: - 对于正反码原码相同; - 对于负,除符号位外,其他各位按位取反。 例如: - 正 `+5` 的反码仍为 `00000101`。 - 负 `-5` 的原码为 `10000101`,将其非符号位取反后得到反码 `11111010`。 #### 补码 补码是为了简化加法器设计而引入的概念,能够统一处理正和负之间的运算。其定义如下: - 对于正补码原码相同; - 对于负,可以通过两种方法获得补码: 1. 将该反码加一; 2. 或者直接将原码逐位取反后再加一。 例如: - 正 `+5` 的补码仍是 `00000101`。 - 负 `-5` 的原码为 `10000101`,通过上述规则可得其补码为 `11111011`[^2]。 以下是实现这一过程的一个 Python 函示例: ```python def get_complements(num, bits=8): if num >= 0: original_code = format(num, f'0{bits}b') complemented_code = original_code else: abs_num = abs(num) original_code = '1' + format(abs_num, f'0{bits-1}b')[-(bits-1):] inverted_bits = ''.join(['1' if b == '0' else '0' for b in original_code[1:]]) complemented_code = bin(int('1'+inverted_bits, 2) + 1)[2:].zfill(bits) return { "original": original_code, "complemented": complemented_code } result = get_complements(-5) print(f"Original Code: {result['original']}, Complemented Code: {result['complemented']}") ``` 以上代码展示了如何基于给定整生成对应的原码补码。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值