2011-01-14 62 views
0

假设您正在使用两个8位无符号值(例如来自定时器)。如果您记录停止时间和开始时间,并从停止开始减去开始时间以获取流逝时间,您是否需要使用mod来处理滚动或减法是否正常?例如说开始时间= 11111100和结束时间= 00000101会(00000101 - 11111100)给你正确的结果?有关二进制算术减法的帮助

回答

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位时的结果相匹配。

1

你可以自己尝试一下,用你的例子:

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

(5- 252)模256 = 9

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

当然,如果你的开始和结束时间之间的差异超过256,这将不起作用。你不知道“结束时间”已经超过“开始时间”多少次,就像经典溢出。