关于计算机二进制编码,你一定要知道这些

原码、反码、补码的计算方法

结论:

  1. 正数有:
    原码 = 其二进制编码
    原码 = 反码 = 补码
  2. 负数有:
    原码 = 其绝对值二进制编码(即:对应正数的原码),最高位置1
    反码 = 原码符号位不变,其他位取反
    补码 = 反码+1

举例:

  • 一个四字节的int类型的数字 9
    原码:0000 0000 0000 0000 0000 0000 0000 1001
    反码:0000 0000 0000 0000 0000 0000 0000 1001
    补码:0000 0000 0000 0000 0000 0000 0000 1001

  • 一个四字节的int类型负数 -9
    原码:1000 0000 0000 0000 0000 0000 0000 1001
    反码:1111 1111 1111 1111 1111 1111 1111 0110
    补码:1111 1111 1111 1111 1111 1111 1111 0111

为什么会有补码?

计算机内部存储的,都是数字的补码!!!
用补码计算,无论是正数运算、负数运算、还是正负数混合运算,都能当做加法处理,快速计算得到结果。
如: 9-9 可以视为 9+(-9),补码计算后直接可以得到0,不用管符号位!

所以:补码看起来很麻烦,但是对计算机友好呀。
简单地说,都用补码的话,计算机内部计算的时候,就可以不用管符号位了,直接当加法算,更加高效。

位运算规则

常用的位运算符有 &, |, ^, ~, <<, >>
当然,对于Java开发者来说,还有一个易混淆的>>>

运算规则:

  • &
    与运算
    两个位都为1时,结果才为1
  • |
    或运算
    两个位都为0时,结果才为0
  • ^
    异或运算
    两个位相同为0,相异为1
  • ~
    取反运算
    0变1,1变0
  • <<
    左移
    各二进位全部左移若干位,高位丢弃,低位补0(相当于乘以2)
  • >>
    带符号右移
    各二进位全部右移若干位,符号位不变,正数左补0,负数左补1,低位舍弃(相当于除以2)
  • >>>
    无符号右移
    各二进制位全部右移若干位,左边一律补0,低位舍弃

位运算常见的应用场景

记住一个口诀
清零取位要用与,某位置一可用或。
若要取反和交换,轻轻松松用异或。

举例:

  • 某位清零,该位&一个0即可
  • 要取某数某位的值,该位置&一个1
  • 要将某位置一,该位|一个1即可
  • 要将某位取反,该位置^一个1
  • 若要交换两个数,也可以用^,方法如下:
    1. a = a^b
    2. b = a^b
    3. a = a^b

关于异或交换两个数的原理:
第2步中,b = a ^b = abb = a(bb) = a^0 = a

扫描二维码关注公众号,回复: 12408106 查看本文章

猜你喜欢

转载自blog.csdn.net/somehow1002/article/details/110356330