• 原码,补码,反码


    1. 二进制表示一个数字,第一位表示符号位

    +1 :  0000 0001

    +2:   0000 0010

    -1:  1000 0001

    -2:  1000 0010

    问题来了,如果只用取反 加减二进制数字来表达 数字的加减, 因为计算机机器只会加法

    1. 正数相加,没问题  0000 0001   + 0000 0010  = 0000 0011

    2. 正数相减, 有问题, 1-2 = 1 + (-2) = 0000 0001  +  1000 0010  = 1000 0011 = -3 ,这个明显不对。

    然后就想到了一个办法,就是取反   1-2 = 1 + (-2) = 0000 0001 + 1111 1101 = 1111  1110  再取反= 1000 0001 = -1 可以了,

    反码是什么,死记硬背就行: 正数的反码=正数 负数的反码= 负数取反,符号位不变.

    那么 -1 + -2 = 1000 0001 + 1000 0010 =  1111 1110 + 1111 1101 = 1000 011 = -3  正确

    1-1 = 0000 0001 + 1000 0001 = 0000 0001 + 1111 1110 = 1111 1111 = 1000 0000 =-0; 正确

    -1 + 2 = 1000 0001 + 0000 0010 = 1111 1110 + 0000 0010 = 0000 0000 = 0; 错误 实际结果是1

    -2 + 4 = 1000 0010 + 0000 0100 = 1111 1101 + 0000 0100 = 0000 0001 = 1; 错误 实际结果是2

    可以看到,这个结果和实际结果偏差1,那么好说,只需要让负数的反码再加1就好了,这就叫反码。

    所以

    -1 + 2 = 1000 0001 + 0000 0010 = 1111 1110 + 1 + 0000 0010 = 0000 0000 + 1 = 0 + 1; 正确

    -2 + 4 = 1000 0010 + 0000 0100 = 1111 1101 + 1 + 0000 0100 = 0000 0001 + 1 = 1+1; 正确

    这样就解释了原码,补码,反码了。

  • 相关阅读:
    Lintcode: Wood Cut
    Lintcode: Update Bits
    Lintcode: Route Between Two Nodes in Graph
    Lintcode: Flip Bits
    Leetcode: Maximum Size Subarray Sum Equals k
    Lintcode: Subarray Sum Closest
    Lintcode: Remove Node in Binary Search Tree
    Lintcode: Majority Number III
    Leetcode: Range Sum Query
    Leetcode: Create Maximum Number
  • 原文地址:https://www.cnblogs.com/gongzhuiau/p/15682261.html
Copyright © 2020-2023  润新知