Подтвердить что ты не робот

Как я могу установить все биты в "1" в двоичном числе неизвестного размера?

Я пытаюсь написать функцию в сборке (но позволяет предположить агностик языка для вопроса).

Как я могу использовать побитовые операторы для установки всех бит переданного числа в 1?

Я знаю, что я могу использовать побитовое "или" с маской с битами, которые хочу установить, но я не знаю, как создать маску, основанную на двоичном числе N размера.

4b9b3361

Ответ 1

~ (x и 0)

x и 0 всегда будут иметь значение 0, а ~ перевернут все биты до 1 с.

Ответ 2

Установите значение 0, затем переверните все биты в 1 с поразрядным-NOT.

Ответ 3

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

Учитывая эту информацию, вы можете запросить либо

  • Как установить целочисленный регистр на все 1 бит?

или

  • Как заполнить область в памяти всеми 1 битами?

Чтобы заполнить регистр всеми 1 битами, на большинстве машин эффективный способ выполняет две команды:

  • Очистите регистр, используя либо специальную команду очистки, либо загрузите сразу 0, либо зарегистрируйте сам регистр.

  • Возьмите побитовое дополнение к регистру.

Заполнение памяти 1 битом затем требует 1 или более инструкций магазина...

В Хэнк Уоррен вы найдете гораздо больше полезных советов и хитростей: замечательная книга Hacker Delight.

Ответ 4

Установите x в 1

В то время как x < номер x = x * 2

Ответ = номер или x - 1.

В коде предполагается, что ваш ввод называется "число". Он должен работать нормально для положительных значений. Примечание для отрицательных значений, которые дополняют две попытки операции, не имеет никакого смысла, так как старший бит всегда будет одним.

Ответ 5

Установите значение -1. Обычно это обозначается всеми битами, равными 1.

Ответ 6

Используйте T(~T(0)).

Где T - это имя типа (если мы говорим о C++.)

Это предотвращает нежелательное продвижение в int если тип меньше, чем int.