Перейти к содержимому

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

  • автор:

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

Например, есть массив чисел 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 + Результат;
КонецЦикла;
Возврат Результат;
КонецФункции

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

Argument ‘Topic id’ is null or empty

Сейчас на форуме

© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru

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

ООО «Планета Эксел»
ИНН 7735603520
ОГРН 1147746834949
ИП Павлов Николай Владимирович
ИНН 633015842586
ОГРНИП 310633031600071

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

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

int a = ~2; // -3 

Как мне всё-таки получить 1 , а не -3 ?
Отслеживать
28.8k 12 12 золотых знаков 59 59 серебряных знаков 118 118 бронзовых знаков
задан 8 фев 2019 в 7:31
IWProgrammer IWProgrammer
841 1 1 золотой знак 15 15 серебряных знаков 30 30 бронзовых знаков
как же так, 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 . Представить число 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), а в знаковый разряд заносится единица.
  • дополнительного кода. Дополнительный код положительного числа совпадает с прямым кодом. Для отрицательного числа дополнительный код образуется путем получения обратного кода и добавлением к младшему разряду единицы.
7 6 5 4 3 2 1 0
1
1 1 1 1 1 0 1 1
0 0 0 0 0 0 0 1
0

В 1-ом разряде возникло переполнение (1 + 1 = 10). Поэтому записываем 0, а 1 переносим на 2-й разряд.

7 6 5 4 3 2 1 0
1 1
1 1 1 1 1 0 1 1
0 0 0 0 0 0 0 1
0 0

В итоге получаем:

7 6 5 4 3 2 1 0
1 1
1 1 1 1 1 0 1 1
0 0 0 0 0 0 0 1
1 1 1 1 1 1 0 0

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

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