Как инвертировать двоичное число
Например, есть массив чисел 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 |