Рубрики
Без рубрики

Методы манипулирования Битами

КАК И Я, Я ВИДЕЛ МНОГИХ ЛЮДЕЙ, ОСОБЕННО НОВИЧКОВ, КОТОРЫЕ БОРОЛИСЬ С МАНИПУЛЯЦИЯМИ С БИТАМИ В БЕГИ… С пометкой “новички”, “учебник”, “карьера”, “java”.

КАК И Я САМ, Я ВИДЕЛ МНОГИХ ЛЮДЕЙ, ОСОБЕННО НАЧИНАЮЩИХ, КОТОРЫЕ ВНАЧАЛЕ БОРОЛИСЬ С МАНИПУЛЯЦИЯМИ С БИТАМИ! 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”