Как инвертировать двоичное число
Перейти к содержимому

Как инвертировать двоичное число

  • автор:

Как инвертировать двоичное число

Например, есть массив чисел 0..255, нужно их инвертировать, наподобии наподобии операции NOT с двоичным числом. Например, есть число 8, в дыоичной системе это будет 00001000 (1 байт), иверсия этого числа будет 11110111, в десятичной системе это будет 247.

Есть ли способы сделать это быстрее и красивее, чем программно переводить в «0» и «1», инвертировать их, а потом опять переводить в десятичную?

Значения массива могут быть от 0..255, т.е. до максимального значения одного байта.
А, стоп. У тебя диапазон чисел 0..255? Заведи массив заранее расчитаных значений.
(1) прийдется писать, если не найду более простых решений
если (2) — то однозначно (3) и без вопросов.

Но код видимо таки прийдется юзать, нужно будет выводить значения в 16-ричном виде.

Кстати, перевод в любую систему из 10-тичной:
http://infostart.ru/public/70053/

// Функия переводит число переданное в параметре
// Значение в строку (либо число) в системе счисления X
// X определяется линой шаблона, представление знаков разрядов
// значение шаблона, где сивол шаблона[k] — есть представление
// Например если шаблок «01», то перевод будет осуществлен в двоичную
// систему счисления, если «01234567», то в восьмиричную
// если «0123456789ABCDEF», то в шестнадцатиричную
// если «ЛИ», то в двоичную, где 0 представлен буквой Л, а 1 буквой И
// вариант шаблона:
// «0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwzyzАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя!@#$%^&*()_-=+<>[]\|/. ;'»»>// представит Значение в сто пятидесятишести ричной системе счисления,
// где соответствующий символ шаблона означает соответствующую цифру разряда
Функция Из_Число_В_XСчисл(Знач Значение, Шаблон)
Результат=»»;
Основание = СтрДлина(Шаблон);
Пока Значение>0 цикл
Остат = Значение%Основание;
Результат1=Сред(Шаблон,Остат+1,1);
Значение = (Значение-Остат)/Основание;
Результат = Результат1 + Результат;
КонецЦикла;
Возврат Результат;
КонецФункции

Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой

Как инвертировать только определённые биты в числе

Мне нужно инвертировать все биты в числе, допустим, 2 ( 10 в двоичной системе) после инвертирования будет равно 01 . Но столкнулся с проблемой, что операция побитового отрицания инвертирует также и знаковый бит и вообще все биты, которыми число представлено в памяти. И получается, что:

int a = ~2; // -3 

Как мне всё-таки получить 1 , а не -3 ?
Отслеживать
28.5k 12 12 золотых знаков 58 58 серебряных знаков 118 118 бронзовых знаков
задан 8 фев 2019 в 7:31
IWProgrammer IWProgrammer
831 1 1 золотой знак 15 15 серебряных знаков 28 28 бронзовых знаков
как же так, 2 — это . 00010 после инвертирования будет. 11101. Поставьте явную задачу
8 фев 2019 в 7:45

5 ответов 5

Сортировка: Сброс на вариант по умолчанию

Вообще-то битовые операции не стоит применять к знаковым целым числам, поэтому я пишу сразу для unsigned .

Увы, из вашего задания мало что понятно. Вы хотите, похоже, инвертировать только биты, начиная со старшего единичного бита?

000010000101 -> 000001111010 000011111111 -> 000000000000 
unsigned int inv(unsigned int x) < unsigned int mask = 0; for(unsigned int y = x;y;y>>=1) (mask

Здесь для 0 все же инвертируем его в 1.

Но вот не уверен, что вы хотите для 7 или там 3 инвертирование в 0 — все их единички.

А вообще — нужно очень точное ТЗ, иначе результатом будет ХЗ.

С тем же успехом, для @avp:

 mov eax, d bsr ecx, eax inc ecx mov ebx, 1 shl ebx, cl dec ebx dec ebx or ebx, 1 xor d, ebx 

Инвертировать полученное двоичное число

Добавлено через 1 минуту
Поясняю. К примеру raznica = 1010101, нужно сначала отнять 1 (будет 1010100), а затем инвертировать числе, оставив первую цифру без изменений и записать в файл ответ (будет 1101011)

Добавлено через 1 час 36 минут
Добавлю, что данное действие должно выполнятся в случае если разница чисел получается отрицательной, а если >=0, то оставить как есть

Добавлено через 23 минуты

ЦитатаСообщение от Programist_NKPC Посмотреть сообщение

Обратный и дополнительный коды двоичных чисел

Формат представления чисел с плавающей запятой
Пример №1 . Представить число 133,54 в форме числа с плавающей точкой.
Решение. Представим число 133.54 в нормализованном экспоненциальном виде:
1.3354*10 2 = 1.3354*exp10 2
Число 1.3354*exp10 2 состоит из двух частей: мантиссы M=1.3354 и экспоненты exp10=2
Если мантисса находится в диапазоне 1 ≤ M 3

Пример №2 . Представить двоичное число 101.102 в нормализованном виде, записать в 32-битом стандарте IEEE754.
Таблица истинности

  • прямого кода. Прямой код двоичного числа совпадает по изображению с записью самого числа.
  • обратного кода. Обратный код для положительного числа совпадает с прямым кодом. Для отрицательного числа все цифры числа заменяются на противоположные (1 на 0, 0 на 1), а в знаковый разряд заносится единица.
  • дополнительного кода. Дополнительный код положительного числа совпадает с прямым кодом. Для отрицательного числа дополнительный код образуется путем получения обратного кода и добавлением к младшему разряду единицы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *