КАК И Я САМ, Я ВИДЕЛ МНОГИХ ЛЮДЕЙ, ОСОБЕННО НАЧИНАЮЩИХ, КОТОРЫЕ ВНАЧАЛЕ БОРОЛИСЬ С МАНИПУЛЯЦИЯМИ С БИТАМИ! SO Я ПОДУМАЛ, ЧТО НАПИШУ ПОСТ так что ЛЮДИ МОГУТ ИЗВЛЕЧЬ ИЗ ЭТОГО ПОЛЬЗУ!
ЭТО ВСЕГО ЛИШЬ ЗАМЕТКИ, КОТОРЫЕ Я ДЕЛАЛ НЕКОТОРОЕ ВРЕМЯ НАЗАД В КАЧЕСТВЕ СПРАВОЧНЫХ ЗАМЕТОК ВСЯКИЙ РАЗ, КОГДА Я ЗАСТРЕВАЛ НА КАКИХ-ЛИБО ВОПРОСАХ О МАНИПУЛЯЦИЯХ С БИТАМИ!
🎯 двоичные числа с индексом 0 ПОМНИТЕ , что сдвиг числа влево на i умножает это число на 2 ^ i , а сдвиг вправо на i делит его на 2 ^ i
🎯 N-1 ИНВЕРТИРУЕТ КАЖДЫЙ БИТ, НАЧИНАЯ С КРАЙНЕГО ПРАВОГО до ИНДЕКСА ‘0’ если
🎯 1<< сдвиг влево 1 на i позиции 1>>i сдвиги вправо на 1 на i позиции
🎯 всякий раз , когда мы хотим переключать , устанавливать, отменять i-й бит числа, мы всегда используем 1 в качестве помощника с различными операторами
🎯 переключение бита: переключение означает 1-> 0 и 0-> 1 1-й ШАГ: сдвиг влево 1 в положение, в котором мы хотим переключиться 2-й ШАГ: мы перенесли 1 в i-й бит (помните, что все остальные равны 0), затем нам нужно сделать его 1, если он равен нулю, и сделать его 0, если он равен одному 3-й ШАГ: итак, у нас есть 1 исправлено , используя это, нам нужно сделать 0-> 1 или 1-> 0, если мы делаем “&” (неверно) (неверно)
‘|’ (правильно) (неверно)
‘^ ‘ (правильно) (правильно)
следовательно, мы могли бы сделать только xor(^)
🎯 установить i-й бит (означает сделать i-й бит 0->1)
мы снова используем 1< чтобы достичь i-й позиции чтобы достичь i-й позиции затем мы делаем ‘|’ с 1<<я следовательно, если бит был равен 0 он становится 1 если он уже был 1, то он все равно остается 1 ПРИМЕЧАНИЕ-ИСПОЛЬЗОВАНИЕ XOR НЕ РЕКОМЕНДУЕТСЯ, ПОТОМУ ЧТО, ЕСЛИ i-Й БИТ УЖЕ УСТАНОВЛЕН, ТО XOR ДАСТ НЕВЕРНЫЙ РЕЗУЛЬТАТ!
🎯 сбросить/очистить i-й бит (сделать 1->0)
нам снова нужен 1 < теперь мы делаем отрицание ~ к этому 1, которое мы взяли, так что 1 в нашем 1 изначально становится 0, а каждый другой бит становится 1 предположим мы делаем 1<<3, чтобы получить 0b00000001->0b00001000 затем ~ дает 0b00001000->0b11110111 |
🎯 Проверка того , установлен или не установлен бит в n – й позиции:
Сдвиньте влево “1” в заданное положение, а затем “И” (“&”).
Еще несколько быстрых хаков:
🎯 Инвертирование каждого бита дополнения числа/1: Если мы хотим инвертировать каждый бит числа, т.е. изменить бит ‘0’ на ‘1’ и бит ‘1’ на ‘0’. Мы можем сделать это с помощью оператора ‘~’. Например: если число (двоичное представление), то “~num” будет “11010011”.
Это также “дополнение числа 1s”.
🎯 Дополнение числа двумя: дополнение числа 2 равно дополнению 1 + 1. Таким образом, формально мы можем получить дополнение 2, найдя дополнение 1 и добавив 1 к результату, т.е. (~ num + 1)
🎯 * Удаление самого низкого установленного бита * : Во многих ситуациях мы хотим удалить младший установленный бит, например, в структуре данных двоичного индексированного дерева, подсчитывая количество установленных битов в числе.
Нам действительно нравится это:
X & (X-1)
Давайте посмотрим на это на примере, пусть.
(X-1) инвертирует все биты до тех пор, пока не встретит наименьший набор “1”, а также инвертирует этот наименьший набор “1”.
X-1 становится 1011. После “объединения” X с X-1 мы удаляем бит наименьшего набора.
🎯 Получение младшего установленного бита числа: Это делается с помощью выражения ‘X & (-X)’Давайте посмотрим на это на примере: Пусть. Таким образом, ~X (дополнение 1) будет “11010011”, а дополнение 2 будет (~ X + 1 или -X) то есть “11010100”. Таким образом, если мы “И” исходное число “X” с дополнением к двум, которое равно “-X”, мы получим наименьший бит.
x & 1 дает младший бит (помогает определить, является ли число четным или нечетным, т.е. если последний бит равен 0, то в противном случае оно четное) xsl & (x-1) очистит младший установленный бит x x & ~ (x-1) извлекает младший установленный бит x (все остальные ясны). Красивые узоры при применении к линейной последовательности. x & (x + (1 0<<, при этом количество установленных битов (возможно, длина 0), начинающееся с бита n, очищено. x & ~(x + (1 << набор битов набора (возможно, длиной 0) в x, начиная с бита n. x | (x + с наименьшим набором очищенных битов. x | ~(x + наименьший очищенный бит x (все остальные установлены). x | (x – (1 <<, с набором очищенных битов (возможно, длиной 0), начиная с установленного бита n. x | ~(x – (1 << самая низкая ступень очищенных битов (возможно, длина 0) в x, начиная с бита n, являются единственными очищенными битами.
НАДЕЮСЬ, ЭТО ПОМОЖЕТ!
Пожалуйста, оставьте ❤️ , если вам понравилась эта статья. A 🦄 было бы здорово. И дайте мне знать на панели обсуждений, если у вас есть какие-либо предложения для меня.
Хорошего Дня! 😃
Некоторые из моих других постов:
готовая статья | Модификаторы доступа Java |
готовая статья | Дженерики Java |
готовая статья | Регулярное выражение Java |
готовая статья | Api потоков Java |
Оригинал: “https://dev.to/the_unconventional_coder/bit-manipulation-hacks-3n88”