Побитови и побитови операции за преместване в 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:
Пожар на статия! И защо в училищните учебници по информатика нямаше такива описания! Благодаря много за статията!