Ответ 1
~ (x и 0)
x и 0 всегда будут иметь значение 0, а ~ перевернут все биты до 1 с.
Я пытаюсь написать функцию в сборке (но позволяет предположить агностик языка для вопроса).
Как я могу использовать побитовые операторы для установки всех бит переданного числа в 1?
Я знаю, что я могу использовать побитовое "или" с маской с битами, которые хочу установить, но я не знаю, как создать маску, основанную на двоичном числе N размера.
~ (x и 0)
x и 0 всегда будут иметь значение 0, а ~ перевернут все биты до 1 с.
Установите значение 0, затем переверните все биты в 1 с поразрядным-NOT.
Вы обнаружите, что на ассемблере вы должны знать размер "пройденного числа". И на ассемблере действительно важно, на какой машине предназначен язык ассемблера.
Учитывая эту информацию, вы можете запросить либо
или
Чтобы заполнить регистр всеми 1 битами, на большинстве машин эффективный способ выполняет две команды:
Очистите регистр, используя либо специальную команду очистки, либо загрузите сразу 0, либо зарегистрируйте сам регистр.
Возьмите побитовое дополнение к регистру.
Заполнение памяти 1 битом затем требует 1 или более инструкций магазина...
В Хэнк Уоррен вы найдете гораздо больше полезных советов и хитростей: замечательная книга Hacker Delight.
Установите x в 1
В то время как x < номер x = x * 2
Ответ = номер или x - 1.
В коде предполагается, что ваш ввод называется "число". Он должен работать нормально для положительных значений. Примечание для отрицательных значений, которые дополняют две попытки операции, не имеет никакого смысла, так как старший бит всегда будет одним.
Установите значение -1
. Обычно это обозначается всеми битами, равными 1.
Используйте T(~T(0))
.
Где T
- это имя типа (если мы говорим о C++.)
Это предотвращает нежелательное продвижение в int
если тип меньше, чем int
.