Битовые операции распределяют по дополнению?

Как несколько человек указали, сон и другие связанные функции по умолчанию зависят от "системной галочки". Это - минимальная единица времени между задачами ОС; планировщик, например, не будет работать быстрее, чем это. Даже с ОС в реальном времени, системная галочка обычно не меньше чем 1 мс. В то время как это является настраиваемым, это имеет последствия для всей системы, не только Вашу функциональность сна, потому что Ваш планировщик будет работать более часто, и потенциально увеличивать издержки Вашей ОС (количество времени для планировщика для выполнения по сравнению с количеством времени задача может работать).

решение этого состоит в том, чтобы использовать внешнее, высокоскоростное устройство часов. Большинство систем Unix позволит Вам определять к Вашим таймерам и таким различным часам для использования, в противоположность системным часам по умолчанию.

5
задан gct 10 November 2009 в 22:41
поделиться

1 ответ

Подумайте об этом ...

sa = 1    ca = 1
sb = 1    cb = 1
a = sa + ca = 2
b = sb + cb = 2
(a | b) = 2
(a & b) = 2
(sa | sb) + (ca | cb) = (1 | 1) + (1 | 1) = 1 + 1 = 2 # Coincidence?
(sa & sb) + (ca & cb) = (1 & 1) + (1 & 1) = 1 + 1 = 2 # Coincidence?

Давайте попробуем некоторые другие значения:

sa = 1001   ca = 1   # Binary
sb = 0100   cb = 1
a = sa + ca = 1010
b = sb + cb = 0101
(a | b) = 1111
(a & b) = 0000
(sa | sb) + (ca | cb) = (1001 | 0101) + (1 | 1) = 1101 + 1 = 1110 # Oh dear!
(sa & sb) + (ca & cb) = (1001 & 0101) + (1 & 1) = 0001 + 1 = 2    # Oh dear!

Итак, пример 4-битного счетчика, доказывающий, что вы не можете распределить И или ИЛИ сверх сложения.

А как насчет '>>>' (беззнаковый или логический сдвиг вправо). Используя значения последнего примера и r = 1:

sa = 1001
ca = 0001
sa >>> 1 = 0101
ca >>> 1 = 0000
(sa >>> 1) + (ca >>> 1) = 0101 + 0000 = 0101
(sa + ca) >>> 1 = (1001 + 0001) >>> 1 = 1010 >>> 1 = 0101  # Coincidence?

Давайте посмотрим, является ли это совпадением:

sa = 1011
ca = 0001
sa >>> 1 = 0101
ca >>> 1 = 0000
(sa >>> 1) + (ca >>> 1) = 0101 + 0000 = 0101
(sa + ca) >>> 1 = (1011 + 0001) >>> 1 = 1100 >>> 1 = 0110  # Oh dear!

Еще раз доказательство контрпримером.

Итак, логический сдвиг вправо также не является распределительным по сравнению с сложением.

8
ответ дан 14 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: