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

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中可以有哪些应用?

 

 

 

 

你可能感兴趣的:(java)