Побитови и побитови операции за преместване в Java и извън него

Целта на статията е да покаже възможностите за практическо приложение на побитовите операции. Побитовите операции се използват за бързо извършване на изчисления и консумират по-малко ресурси, свързани с тези изчисления.

В Java има следните видове побитови операции:

ИЛИ (ИЛИ)
&И
^ИЗКЛЮЧИТЕЛНО ИЛИ (XOR)

ОТРИЦАТЕЛНО (НЕ)

Също така си струва да подчертаете операциите за изместване на битове:

>дясна смяна
>>>неподписано дясно изместване

Побитови операции

Прилага се към всяка двойка битове, които са в една и съща позиция в две поредици от битове.

Побитово ИЛИ (ИЛИ)

Операторът е обозначен със символа

Задава стойността на 1, ако съответният бит е зададен в първата или втората последователност, или и двете

Побитово И (И)

Задава стойността на 1, ако съответните битове са зададени едновременно в първата и втората последователност

ИЗКЛЮЧИТЕЛНО ИЛИ (XOR)

Задава стойността на 1, ако съответният бит е зададен в първата или във втората последователност, но не и в двете.

Ако се използват повече от две последователности, тогава резултатът ще бъде едно, когато общият брой единици на съответната позиция е нечетен.

Побитово ОТРИЦАТЕЛНО (НЕ)

Унарен оператор, т.е. приложен към една последователност. Превръща всеки бит в неговата противоположност.

Подписан ляв оператор за смяна >

Всички битове са изместени надясно. Числото отляво се допълва с нула, ако числото е положително и едно,ако е отрицателен. Операцията се използва за бързо деление на 2. Ако се раздели нечетно число, остатъкът се изхвърля за положителни числа и се запазва за отрицателни.

Неподписан оператор за смяна >>>

Всички битове се изместват надясно, числото отляво се допълва с нула, дори ако операцията се извършва с отрицателни числа. Оттам идва и името на оператора - unsigned. В резултат на прилагането на оператора винаги се получава положително число, защото в Java левият бит отговаря за знака на числото. Операцията, подобно на оператора за десен преместване със знак, съответства на разделяне на число на две, с изключение на първото изместване в отрицателно число.

Приложение в практиката

Първото нещо, което трябва да разберем е, че някаква информация е скрита зад последователността от битове, които можем да манипулираме чрез битови операции, например, това може да бъде списък с булеви стойности или просто числа, които са по-удобни за манипулиране в двоично представяне

Когато броят на смените надвишава броя на цифрите

Когато използвате битови смени, важно е да запомните, че когато броят на смените достигне броя на битовете, следващото изместване ще върне стойността в първоначалната й позиция. Например преместете наляво:

Също така има смисъл да се отбележи, че след 31-вата смяна няма позиция, където всички нули.

Коригиране на числа към подходящия тип данни

Когато използвате побитови операции с типове данни byte/short, числата първо се преобразуват в int и ако едно от числата е дълго, след това в long.

При стесняване на типа данни лявата страна на битовете просто се изхвърля, например:

Един от начините за работа с битови данни е използването на маска. Маската ви позволява да получите стойностите само на определени битове в последователността.Например, имаме маска 00100100, тя ни позволява да получим от последователността само онези битове, които са зададени в нея. В този случай това са 3-та и 7-ма цифра. За да направите това, достатъчно е да извършите побитово И с нашата маска и определено число:

Съхраняване на множество стойности в една целочислена променлива

Използвайки битови смени, можете да съхранявате множество стойности с по-малка дължина в една цяло число променлива. Например, можете да съхраните едно число в първите няколко бита и друго число в следващите няколко бита. Изисква се само да се знае колко бита са изместени и колко бита заема съхраненото число. Логическо ИЛИ се използва за запис, И се използва за получаване.

В следващия пример три стойности се съхраняват в едно число - възраст, височина, тегло и след това се четат от него. Недостатъкът на такава система е необходимостта да се помни, че запаметените стойности не трябва да надвишават броя на битовете, които са дефинирани за тях. Например, ако в примера една от стойностите надвишава числото 255, тогава ще получим грешен резултат.

Работа с права за достъп

Друг обичаен пример за използване на битови операции е работата с права за достъп до папки и файлове. Принципът е следният. Има последователност от три бита, където: 001 - първият бит отговаря за правата за изпълнение 010 - вторият - запис 100 - третият - четене

Имаме следните константи.

Да кажем, че искаме да дадем на потребител пълен достъп до ресурс. За да направите това, всеки бит трябва да бъде зададен:

А сега да кажем, че трябва да отнемем правата за изпълнение от потребителя:

Размяна на променливи без използване на временна променлива

XOR може да се използва за обмен на две променливи без създаване на временна променлива:

Вярно е, че в реалния живот методът с временна променлива работи по-бързо. Този пример е предоставен само за образователни цели.

На базата на изключително ИЛИ работи шифърът Вернам, за който е доказана абсолютна криптографска сигурност. Шифърът беше "разбит" във филма "Парола" Swordfish ""

Бързо умножение и деление

Операциите на преместване се препоръчват за бързо умножение и деление на цели числа на числа, равни на степен две. Например изразът 3 Alba:

Пожар на статия! И защо в училищните учебници по информатика нямаше такива описания! Благодаря много за статията!