帮助二进制算术减法

时间:2011-01-14 14:42:27

标签: binary math subtraction

假设您正在使用两个8位无符号值,例如来自计时器。如果你记录一个停止时间和一个开始时间,并从停止减去开始来获得经过的时间,你是否需要使用mod来处理翻转或减法是否正常?比如说开始时间= 11111100,结束时间= 00000101会(00000101 - 11111100)给你正确的结果吗?

2 个答案:

答案 0 :(得分:1)

您可以自己尝试一下,例如:

  • 开始时间= 1111 1100(= 252)
  • 结束时间= 0000 0101(= 5)

(5-252)modulo 256 = 9.

  • 结束时间 - 开始时间= 0000 0101 - 1111 1100 = 0000 1001(= 9)

当然,如果您的开始和结束时间之间的差异超过256,这将无效。您无法知道“结束时间”已超过“开始时间”的次数,就像经典溢出一样

答案 1 :(得分:0)

是的,减法按你所希望的那样运作。您无需执行任何特殊操作即可处理翻转。对于您的示例时间,减法表现良好:

00000101 - 11111100 == 00001001
(5)      - (252)    == (9)

或者:

(5+256)  - (252)    == (9)

请参阅此Python测试以证明它:

>>> all((j - i) & 0xFF == ((j & 0xFF) - i) & 0xFF
...     for i in range(256)
...     for j in range(i, i + 256))
True

j & 0xFF时,i字词将小于j > 255。这不会影响8位结果;这表明这些值仍然与j未被屏蔽为8位的结果相匹配。