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

StackOverflow https://stackoverflow.com/questions/818535

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

~ (x & amp; 0)

x & amp; 0 всегда приводит к 0, а ~ переворачивает все биты в 1 с.

Другие советы

Установите его в 0, затем переверните все биты в 1 с побитовым-НЕ.

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

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

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

или

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

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

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

  2. Возьмите побитовое дополнение регистра.

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

Еще больше полезных советов и подсказок вы найдете в замечательной книге Хэнка Уоррена. Хакерское наслаждение.

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

Пока x < число   х = х * 2

Ответ = число или x - 1.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top