Вопрос кажется вполне прилично сформулированным
У меня есть виртуальная машина, которая реализует только И, XOR, SHL и SHR, все же я должен сделать "ИЛИ 0x01" операция.
Прежде всего, достаточно иметь правильное побитовое вычисление для следующих двух переменных, поскольку они охватывают все комбинации:
A=0101
B=0011
Мы хотим
0101
0011
A или B
0111
для xor получаем
0101
0011
A xor B
0110
for и получаем
0101
0011
A и B
0001
поэтому если мы соединим их xor, то получим.
(A xor B) xor (A и B)
Я бы просто расширил закон ДеМоргана : A или B = нет (не A и не B)
. Вы можете вычислить , а не
, выполняя операцию XOR со всеми 1 битами.
Я бы просто начал с
a xor b = ((not a) and b) or (a and (not b))
и раскрыл бы эту логическую алгебру, пока это не станет похоже на
a or b = <expression using only and, xor>
По общему признанию, на самом деле это, вероятно, больше работы, чем идти путем «пробовать каждую мыслимую комбинацию битов», но тогда вы просил идеи решения домашней работы. :)
Таблица правды, обобщенная в Википедии здесь и, основные материалы CS 101, Закон де Моргана....
AND 0 & 0 0 0 & 1 0 1 & 0 0 1 & 1 1 OR 0 | 0 0 0 | 1 1 1 | 0 1 0 | 0 1 XOR 0 ^ 0 0 0 ^ 1 1 1 ^ 0 1 1 ^ 1 0
Сдвиг влево включает в себя смещение битов справа налево, предположим:
+-+-+-+-+-+-+-+-+ |7|6|5|4|3|2|1|0| +-+-+-+-+-+-+-+-+ |0|0|0|0|0|1|0|0| = 0x4 hexadecimal or 4 decimal or 100 in binary +-+-+-+-+-+-+-+-+ Shift Left by 2 places becomes +-+-+-+-+-+-+-+-+ |7|6|5|4|3|2|1|0| +-+-+-+-+-+-+-+-+ |0|0|0|1|0|0|0|0| = 0x10 hexadecimal or 16 decimal or 10000 in binary +-+-+-+-+-+-+-+-+ Shift Right by 1 places becomes +-+-+-+-+-+-+-+-+ |7|6|5|4|3|2|1|0| +-+-+-+-+-+-+-+-+ |0|0|0|0|1|0|0|0| = 0x8 hexadecimal or 8 decimal or 1000 in binary +-+-+-+-+-+-+-+-+
Тогда речь идет о комбинировании побитовых операций в соответствии с приведенной выше таблицей истинности...