помочь с двоичным арифметическим вычитанием - PullRequest
0 голосов
/ 14 января 2011

Предполагается, что вы работаете с двумя 8-битными значениями без знака, например, из таймера.Если вы записываете время остановки и время начала и вычитаете время начала из остановки, чтобы получить истекшее время, вам нужно использовать мод для обработки опрокидывания, или вычитание просто работает?Например, скажем, время начала = 11111100, а время окончания = 00000101 (00000101 - 11111100) даст вам правильный результат?

Ответы [ 2 ]

1 голос
/ 14 января 2011

Вы можете попробовать сами, на вашем примере:

  • время начала = 1111 1100 (= 252)
  • время окончания = 0000 0101 (= 5)

(5-252) по модулю 256 = 9.

  • время окончания - время начала = 0000 0101 - 1111 1100 = 0000 1001 (= 9)

Конечно, это не сработает, если разница между временем начала и окончания превысит 256. Вы не можете знать, сколько раз "время окончания" прошло "время начала", как классические переполнения .

0 голосов
/ 14 января 2011

Да, вычитание работает так, как вы надеетесь.Вам не нужно делать ничего особенного, чтобы справиться с опрокидыванием.Для вашего примера раз вычитание хорошо себя ведет:

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

The j & 0xFF term будет меньше, чем i когда j > 255.Это не влияет на 8-битные результаты;это показывает, что эти значения по-прежнему соответствуют результатам, когда j не маскируется до 8 бит.

...