2011-01-14 61 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,這將不起作用。你不知道「結束時間」已經超過「開始時間」多少次,就像經典溢出。