Давайте сначала посмотрим на bitset ().Я не буду публиковать код на C, но мы можем решить это на бумаге для начала.
Скажем, у вас есть целые числа со следующими битовыми комбинациями: x = 1011
и y = 0101
.(Я изменяю номера вашего примера. И, кстати, это не то, как вы бы определили два целых числа, имеющие эти битовые комбинации, но сейчас мы фокусируемся на логике.)
Если я правильно понимаю, когда вы звоните bitset(x, y)
, вы хотите, чтобы ответ Z равнялся 1111
.
x = 1011
y = 0101
^ ^-------- Because these two bits have the value 1, then your answer also
has to set them to 1 while leaving the other bits in x alone.
Хорошо, какая побитовая операция выполнит это?У вас есть AND (&
), OR (\
), XOR (^
) и COMPLEMENT (~
).
В этом случае вы используете OR для двух значений.Глядя на следующую таблицу истинности:
x 1 0 1 1
y 0 1 0 1
-----------------
(x OR y) 1 1 1 1
Каждый бит в последней строке задается ORing этого столбца в x и y.Итак (1 ИЛИ 0) = 1, (0 ИЛИ 1) = 1, (1 ИЛИ 0) = 1, (1 ИЛИ 1) = 1
Итак, теперь вы можете написать набор битов функции C (x,y), ORs x и y, и возвращает результат в виде Z.
Какой побитовый оператор - и вы можете сделать это в несколько шагов с несколькими операторами - вы бы использовали для очистки битов?
x 1 0 1 1
y 0 1 0 1
-------------------------------------------
(SOME OPERATONS INVOLVING x and y) 1 0 1 0
Какими будут эти логические операторы (из списка выше)?Подумайте об операторах «и» и «дополнение».
Удачи вам в игре!
Бонус: быстрый учебник по выражению целых чисел в C.
int x = 1337
создает целое число и присваивает ему значение 1337
.Если вы сказали x = 01337
, то x НЕ будет иметь значение «1337», как вы могли ожидать.Помещая 0
перед числом, вы говорите С, что это число в восьмеричном (основание 8).Цифры "1337", интерпретируемые в основании 8, эквивалентны десятичному (основание 10) 735. Если вы сказали x = 0x1337
, то вы выражаете число в основании 16 как шестнадцатеричное, эквивалентное 4919 в основании 10.