2011-01-14 49 views
0

タイマーのような2つの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 - = 9

  • 終了時刻252)モジュロ256 - 開始時刻= 0000 0101から1111 1100 0000 = 1001(= 9)

開始時間と終了時間の差が256を超える場合はもちろん、これは機能しません。「終了時間」が古典的な「開始時間」を何回過ぎているかは分かりませんオーバーフローする。