Czym są operatory bitowe?

Jestem kimś, kto pisze kod tylko dla zabawy i nie zagłębiłem się w niego ani w środowisku akademickim, ani zawodowym, więc rzeczy takie jak te operatory bitowe naprawdę mi umykają.

Czytałem artykuł o JavaScript, który najwyraźniej obsługuje operacje bitowe. Ciągle widzę tę operację wspomnianą w miejscach, i próbowałem przeczytać o tym, aby dowiedzieć się, co to dokładnie jest, ale wydaje mi się, że w ogóle tego nie rozumiem. Więc czym one są? Jasne przykłady byłyby świetne! : D

Jeszcze kilka pytań-jakie są praktyczne zastosowania operacji bitowych? Kiedy możesz ich użyć?

Author: meagar, 2008-11-10

9 answers

Ponieważ nikt nie poruszył tematu, dlaczego są one przydatne:

Podczas pracy z flagami często używam operacji bitowych. Na przykład, jeśli chcesz przekazać serię FLAG do operacji (np. File.Otwarte, z włączonym trybem odczytu i zapisu), można przekazać je jako pojedynczą wartość. Jest to możliwe poprzez przypisanie każdemu możliwemu znacznikowi własnego bitu w bitsecie (byte, short, int lub long). Na przykład:

 Read: 00000001
Write: 00000010

Więc jeśli chcesz zdać czytać i pisać, możesz przeczyta (odczyt | zapis), który następnie łączy te dwa w

00000011

Które następnie można odszyfrować na drugim końcu jak:

if ((flag & Read) != 0) { //...

Które sprawdzają

00000011 &
00000001

Który zwraca

00000001

Która nie jest równa 0, więc flaga określa READ.

Możesz użyć XOR do przełączania różnych bitów. Używałem tego podczas używania flagi do określania wejść kierunkowych (Góra, Dół, Lewo, Prawo). Na przykład, jeśli sprite porusza się poziomo i chcę, aby się obrócił wokół:

     Up: 00000001
   Down: 00000010
   Left: 00000100
  Right: 00001000
Current: 00000100

Po prostu XOR bieżącej wartości z (LEWO / PRAWO|, który będzie wyłączyć lewo i prawo na, w tym przypadku.

Przesuwanie bitów jest przydatne w kilku przypadkach.

x << y

Jest tym samym co

X * 2 y

Jeśli trzeba szybko pomnożyć przez potęgę dwóch, ale uważaj na przesunięcie 1-bitu do górnego bitu - spowoduje to, że liczba będzie ujemna, chyba że jest niepodpisana. Jest to również przydatne przy radzeniu sobie z różnymi rozmiarami data. Na przykład odczyt liczby całkowitej z czterech bajtów:

int val = (A << 24) | (B << 16) | (C << 8) | D;

Zakładając, że A jest najbardziej znaczącym bajtem, A D najmniej. Skończyłoby się tak:

A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011

Kolory są często przechowywane w ten sposób (z najważniejszym bajtem ignorowanym lub używanym jako alfa):

A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000

Aby znaleźć wartości ponownie, po prostu przesuń bity w prawo, aż znajdą się na dole, a następnie zamaskuj pozostałe bity wyższego rzędu:

Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF

0xFF jest tym samym co 111111111. Więc zasadniczo, dla Czerwonego to byś to robił:

Color >> 16 = (filled in 00000000 00000000)11111111 00010101  (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)
 172
Author: Ed Marty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-24 16:55:16

Operatory bitowe to operatory, które działają na bit w czasie.

I jest 1 tylko wtedy, gdy oba jego wejścia są 1.

Lub jest 1, jeśli jedno lub więcej jego wejść wynosi 1.

XOR jest 1 tylko wtedy, gdy dokładnie jedno z jego wejść jest 1.

NOT jest 1 tylko wtedy, gdy jego dane wejściowe są 0.

Można je najlepiej opisać jako tablice prawdy. Wejścia są na górze i po lewej stronie, Bit wynikowy jest jedną z czterech (dwóch w przypadku NOT, ponieważ ma tylko jedno wejście) wartości pokazanych na przecięcie dwóch wejść.
AND|0 1      OR|0 1
---+----    ---+----
  0|0 0       0|0 1
  1|0 1       1|1 1

XOR|0 1     NOT|0 1
---+----    ---+---
  0|0 1        |1 0
  1|1 0

Jednym z przykładów jest to, że jeśli chcesz tylko niższe 4 bity liczby całkowitej, ty i to z 15 (binarne 1111) TAK:

    203: 1100 1011
AND  15: 0000 1111
------------------
 IS  11: 0000 1011
 25
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-26 07:15:42

Warto zauważyć, że jednobitowe tablice prawdy wymienione jako inne odpowiedzi działają tylko na jednym lub dwóch bitach wejściowych na raz. Co się dzieje, gdy używasz liczb całkowitych, takich jak:

int x = 5 & 6;

Odpowiedź leży w binarnym rozszerzeniu każdego wejścia:

  5 = 0 0 0 0 0 1 0 1
& 6 = 0 0 0 0 0 1 1 0
---------------------
      0 0 0 0 0 1 0 0

Każda para bitów w każdej kolumnie jest uruchamiana przez funkcję "i", aby dać odpowiedni bit wyjściowy w dolnej linii. Odpowiedź na powyższe wyrażenie to 4. Procesor wykonał (w tym przykładzie) 8 oddzielnych operacji "i" w równolegle, po jednym dla każdej kolumny.

Wspominam o tym, ponieważ wciąż pamiętam, że miałem to " AHA!"moment, kiedy dowiedziałem się o tym wiele lat temu.
 24
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-10 00:16:42

Są to operatory bitowe, wszystkie obsługiwane w JavaScript:

  • op1 & op2 -- operator AND porównuje dwa bity i generuje wynik 1, jeśli oba bity są równe 1; w przeciwnym razie zwraca 0.

  • op1 | op2 -- operator OR porównuje dwa bity i generuje wynik 1, jeśli bity są komplementarne; w przeciwnym razie zwraca 0.

  • op1^ op2 -- operator EXCLUSIVE-OR porównuje dwa bity i zwraca 1, Jeśli jeden z bitów ma wartość 1 i daje 0, jeśli oba bity to 0 LUB 1.

  • ~op1 -- operator C OMPLEMENT służy do odwracania wszystkich bitów operandu.

  • op1 << op2 -- operator SHIFT LEFT przesuwa bity w lewo, odrzuca skrajnie lewy bit, A prawemu bitowi przypisuje się wartość 0. Każdy ruch w lewo skutecznie mnoży op1 przez 2.

  • op1 >> op2 -- The SHIFT RIGHT operator przesuwa bity w prawo, odrzuca skrajnie prawy bit i przypisuje lewemu bitowi wartość 0. Każdy ruch do prawo skutecznie dzieli op1 na pół. Zachowany jest najbardziej lewy znak.

  • op1 >>> op2 -- The SHIFT RIGHT - ZERO FILL operator przesuwa bity w prawo, odrzuca skrajnie prawy bit i przypisuje lewemu bitowi wartość 0. Każdy ruch w prawo skutecznie dzieli op1 na pół. Najbardziej lewy bit znaku jest odrzucany.

 14
Author: Jeff Hillman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 10:24:19

Aby podzielić go nieco bardziej, ma to wiele wspólnego z binarną reprezentacją danej wartości.

For example (in decimal):
x = 8
y = 1

would come out to (in binary):
x = 1000
y = 0001

From there, you can do computational operations such as 'and' or 'or'; in this case:
x | y = 
1000 
0001 |
------
1001

or...9 in decimal
Mam nadzieję, że to pomoże.
 4
Author: javamonkey79,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-10 00:14:43

Kiedy pojawia się termin "bitowy", czasami wyjaśnia się, że is nie jest operatorem "logicznym".

Na przykład w JavaScript, operatory bitowe traktują swoje operandy jako ciąg 32 bitów (zer i jedynek); tymczasem operatory logicznesą zwykle używane z wartościami logicznymi (logicznymi) , ale mogą pracować z typami Nie-logicznymi.

Weźmy na przykład expr1 && expr2.

Zwraca expr1, jeśli można go przekonwertować do false; w przeciwnym razie zwraca expr2. Tak więc, gdy jest używany z wartościami logicznymi, && zwraca true, jeśli oba operandy są true; w przeciwnym razie zwraca false.

a = "Cat" && "Dog"     // t && t returns Dog
a = 2 && 4     // t && t returns 4

Jak zauważyli inni, 2 & 4 jest bitowe i, więc zwróci 0.

Możesz skopiować następujące elementy do testu.html czy coś i test:

<html>
<body>
<script>
    alert("\"Cat\" && \"Dog\" = " + ("Cat" && "Dog") + "\n"
        + "2 && 4 = " + (2 && 4) + "\n"
        + "2 & 4 = " + (2 & 4));
</script>
 4
Author: Eugene Yokota,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-10 00:33:41

W programowaniu komputerowym , operacja bitowa działa na jednym lub więcej wzorcach bitowych lub cyfrach binarnych na poziomie ich poszczególnych bitów . Jest to szybka, prymitywna akcja obsługiwana bezpośrednio przez procesor i służy do manipulowania wartościami do porównań i obliczeń. oprawa

  • Bitowe i

  • Bitowe lub

  • Bitowo Nie

  • Bitowe XOR

  • Etc

Pozycja listy

    AND|0 1        OR|0 1 
    ---+----      ---+---- 
      0|0 0         0|0 1 
      1|0 1         1|1 1 

   XOR|0 1        NOT|0 1 
   ---+----       ---+--- 
     0|0 1           |1 0 
     1|1 0

Np.

    203: 1100 1011
AND  15: 0000 1111
------------------
  =  11: 0000 1011

Użycie operatora bitowego

  • operatory przesunięcia w lewo i przesunięcia w prawo są równoważne odpowiednio mnożeniu i dzieleniu przez x * 2 y .

Np.

int main()
{
     int x = 19;
     printf ("x << 1 = %d\n" , x <<1);
     printf ("x >> 1 = %d\n", x >>1);
     return 0;
}
// Output: 38 9
  • operator & może być użyty do szybkiego sprawdzenia, czy liczba jest nieparzysta czy parzysta

Np.

int main()
{
    int x = 19;
    (x & 1)? printf("Odd"): printf("Even");
    return 0;
 }
// Output: Odd
  • Quick find minimum x i y bez if else statment

Np.

int min(int x, int y)
{
    return y ^ ((x ^ y) & - (x < y))
}
  • dziesiętne do binarnych konwersja

Np.

#include <stdio.h>
int main ()
{
    int n , c , k ;
    printf("Enter an integer in decimal number system\n " ) ;
    scanf( "%d" , & n );
    printf("%d in binary number
    system is: \n " , n ) ;
    for ( c = 31; c >= 0 ; c -- )
    {
         k = n >> c ;
         if ( k & 1 )
              printf("1" ) ;
         else
              printf("0" ) ;
      }
      printf(" \n " );
      return 0 ;
}
  • szyfrowanie bramy XOR jest popularną techniką, ze względu na jej zgodność i wykorzystanie przez programistów.
    • Operator bitowy XOR jest najbardziej użytecznym operatorem z punktu widzenia wywiadu technicznego.

przesunięcie bitwuse działa tylko z liczbą + ve

Istnieje również szeroki zakres zastosowania bitwise logika

 2
Author: Prashant Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-22 03:59:10

Myślenie o tym w ten sposób może pomóc. Tak działa i ( & ):

W zasadzie mówi, że obie te liczby są jedynkami, więc jeśli masz dwie liczby 5 I 3, zostaną one przekonwertowane na binarne i komputer pomyśli

         5: 00000101
         3: 00000011

Są jedno: 00000001 0 jest false, 1 jest true

Więc i z 5 i 3 jest jednym. Operator OR (|) robi to samo z tym wyjątkiem, że tylko jedna z liczb musi być jedna, aby wyjść 1, a nie obie.

 1
Author: user3677963,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-25 12:41:11

Ciągle słyszałem o tym, jak powolne były operatory bitowe JavaScript. Zrobiłem kilka testów dla Mój ostatni post na blogu{[2] } i okazało się, że były one 40% do 80% szybciej niż alternatywa arytmetyczna w kilku testach. Może kiedyś byli powolni. W nowoczesnych przeglądarkach, uwielbiam je.

Mam jeden przypadek w moim kodzie, który będzie szybszy i łatwiejszy do odczytania z tego powodu. Będę miał oczy otwarte na więcej.

 -5
Author: Nosredna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-25 12:37:40