Frage

Ich bin jemand, der Code nur zum Spaß schreibt und nicht wirklich in sie entweder in einer akademischen oder beruflichen Einstellung vertieft, so Sachen wie diese Bitoperatoren wirklich entgeht mir.

Ich habe einen Artikel über JavaScript zu lesen, die scheinbar bitweise Operationen unterstützt. Ich halte diese Operation an Orten erwähnt zu sehen, und ich habe versucht, das Lesen über, um herauszufinden, was genau es ist, aber ich glaube einfach nicht, es überhaupt zu bekommen. Also, was sind sie? Klare Beispiele wären toll! : D

Nur noch ein paar Fragen - was sind einige praktische Anwendungen von Bit-Operationen? Wann könnten Sie sie verwenden?

War es hilfreich?

Lösung

Da niemand hat angeschnitten, das Thema, warum diese sind nützlich:

Ich verwende bitweise Operationen viel, wenn sie mit Fahnen arbeiten. Zum Beispiel, wenn Sie eine Reihe von Flaggen auf eine Operation übergeben wollen (sagen wir, File.Open(), mit Lesemodus und Schreibmodus beide aktiviert), könnte man sie als einen einzigen Wert übergeben. Dies wird durch die Zuordnung jedes mögliche Flag seinen eigenen Bit in einem bitset (byte, short, int oder lang) erreicht. Zum Beispiel:

 Read: 00000001
Write: 00000010

Also, wenn Sie lesen weitergeben wollen und schreiben, würden Sie (READ | WRITE) übergeben, die dann die beiden in

vereint
00000011

die dann am anderen Ende entschlüsselt werden wie:

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

die überprüft,

00000011 &
00000001

, die zurück

00000001

, die nicht 0 ist, so das Flag READ spezifiziert.

Sie können XOR verwenden, um verschiedene Bits zu wechseln. Ich habe dies verwendet, wenn ein Flag mit Richtungseingaben zu spezifizieren (oben, unten, links, rechts). Wenn zum Beispiel ein Sprite horizontal bewegt, und ich möchte es umdrehen:

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

I XOR einfach den aktuellen Wert mit (LEFT | RIGHT), die und nach rechts auf links ab biegen, in diesem Fall

.

Bitverschiebung ist nützlich in mehreren Fällen.

x << y

ist die gleiche wie

  

x * 2 y

, wenn Sie benötigen, um schnell multiplizieren mit einer Zweierpotenz, aber achten Sie auf einen 1-Bit in die oberen Bitverschieben - das macht die Zahl negativ, wenn es ohne Vorzeichen ist. Es ist auch nützlich, wenn sie mit verschiedenen Größen von Daten zu tun. Um zum Beispiel eine ganze Zahl von vier Bytes zu lesen:

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

Unter der Annahme, dass A der höchstwertigen Byte und D die am wenigsten ist. Es würde am Ende als:

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

Die Farben werden auf diese Weise oft gespeichert (mit dem höchstwertigen Byte entweder ignoriert oder als Alpha):

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

Um die Werte zu wieder finden, verschieben Sie einfach die Bits nach rechts, bis er am Boden ist, dann die restlichen höherwertigen Bits maskieren:

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

0xFF ist die gleiche wie 11111111. So im Wesentlichen, für Rot, würden Sie dies tun:

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)

Andere Tipps

Es ist erwähnenswert, dass die Ein-Bit-Wahrheitstabellen als andere Antworten aufgelistet auf Arbeit nur ein oder zwei Eingangsbits zu einem Zeitpunkt. Was passiert, wenn Sie ganze Zahlen verwenden, wie zum Beispiel:

int x = 5 & 6;

Die Antwort liegt in der Binärentwicklung jeden Eingangs:

  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

Jedes Paar von Bits in jeder Spalte wird durch die „UND“ Funktion ausführen, um den entsprechenden Ausgabe-Bit in der unteren Zeile zu geben. So ist die Antwort auf den obigen Ausdruck ist 4. Die CPU (in diesem Beispiel) 8 separate „AND“ Operationen parallel für jede Spalte eines getan hat.

Ich erwähne das, weil ich diese noch mit erinnern „AHA!“ Moment, wenn ich über diese vor vielen Jahren gelernt.

Bit-Operatoren sind Operatoren, die zu einem Zeitpunkt auf ein bisschen arbeiten.

AND 1 nur dann, wenn seine beiden Eingänge 1 sind.

oder 1 ist, wenn eine oder mehrere seiner Eingänge 1 sind.

XOR 1 nur dann, wenn genau einer der Eingänge 1 sind.

NOT 1 nur, wenn der Eingang 0 ist.

Diese können am besten als Wahrheitstabellen beschrieben. Eingänge Möglichkeiten auf der oberen und linken, die sich ergebende Bit ist eines der vier (zwei in dem Fall keines, da es nur einen Eingang) Werte an den Schnittpunkt der beiden Eingänge gezeigt.

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

Ein Beispiel ist, wenn Sie nur die unteren 4 Bits einer ganzen Zahl wollen, können Sie und es mit 15 (binär 1111) so:

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

Dies sind die Bit-Operatoren, die alle in JavaScript unterstützt:

  • op1 & op2 - Der AND Operator vergleicht zwei Bits und erzeugt ein Ergebnis von 1, wenn beide Bits 1 sind; Andernfalls gibt es 0 Punkte.

  • op1 | op2 - Der OR Operator vergleicht zwei Bits und erzeugt ein Ergebnis von 1, wenn die Bits komplementär sind; Andernfalls gibt es 0 Punkte.

  • op1 ^ op2 - Der EXCLUSIVE-OR Operator vergleicht zwei Bits und gibt 1, wenn eine der Bits 1 und es gibt 0, wenn beide Bits 0 oder 1

  • .
  • ~op1 -. Der COMPLEMENT Operator verwendet wird alle Bits des Operanden zu invertieren

  • op1 << op2 -. Der SHIFT LEFT Bediener die Bits nach links bewegt, verwirft das Bit ganz links, und ordnet das Bit ganz rechts einen Wert von 0. Jeder Umzug in die op1 effektiv vervielfacht links von 2

  • op1 >> op2 - Der SHIFT RIGHT Bediener die Bits nach rechts bewegt, verwirft den rechten Bit und weist das linke Bit den Wert 0 Jeder Zug nach rechts effektiv op1 in zwei Hälften teilt. Die am weitesten links stehenden Vorzeichenbit wird beibehalten.

  • op1 >>> op2 - Der SHIFT RIGHT - ZERO FILL Bediener die Bits nach rechts bewegt, verwirft den rechten Bit und weist das linke Bit den Wert 0 Jeder Zug nach rechts effektiv op1 in zwei Hälften teilt. Die am weitesten links stehenden Vorzeichenbit wird verworfen.

Um es zu brechen ein bisschen mehr nach unten, es hat viel mit der binären Darstellung des Wertes in Frage zu tun.

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

Hoffe, das hilft.

Wenn der Begriff „bitweise“ genannt wird, ist es manchmal ist zu, dass ist nicht einen „logischen“ Operator.

Zum Beispiel in JavaScript, Bitoperatoren behandeln ihre Operanden als eine Folge von 32 Bits (Nullen und Einsen) ; Inzwischen logische Operatoren werden in der Regel mit Boolean (logischen) Werten verwendet aber arbeiten mit nicht-Boolesche Typen können.

Nehmen Sie ausdr1 && expr2 zum Beispiel.

  

Returns expr1, wenn sie umgerechnet werden können   false; andernfalls kehrt expr2.   Wenn also mit Boolesche Werte verwendet,   && gibt true zurück, wenn beide Operanden   wahr; andernfalls wird false zurückgegeben.

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

Wie andere erwähnt haben, 2 & 4 ist eine bitweise AND, so wird es 0 zurück.

Sie können die folgende test.html oder etwas und Test kopieren:

<html>
<body>
<script>
    alert("\"Cat\" && \"Dog\" = " + ("Cat" && "Dog") + "\n"
        + "2 && 4 = " + (2 && 4) + "\n"
        + "2 & 4 = " + (2 & 4));
</script>
  

In digitaler Computerprogrammierung, eine bitweise Operation arbeitet auf einem oder mehreren Bitmustern oder binäre Ziffern auf der Ebene ihrer einzelnen Bits. Es ist eine schnelle, primitive Aktion direkt vom Prozessor unterstützt, und verwendet wird, um Werte für Vergleiche und Berechnungen zu manipulieren.

Operationen :

  • bitweise AND

  • bitweise OR

  • bitweise NOT

  • bitweise XOR

  • etc

Liste item

    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

Eg.

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

Verwendung von Bit-Operator

  • Die Linksverschiebung und Rechtsverschiebungsoperator sind äquivalent zu einer Multiplikation und Division durch x * 2 y ist.

Eg.

int main()
{
     int x = 19;
     printf ("x << 1 = %d\n" , x <<1);
     printf ("x >> 1 = %d\n", x >>1);
     return 0;
}
// Output: 38 9
  • Der Operator & schnell verwendet werden, zu überprüfen, ob eine Zahl gerade oder ungerade ist

Eg.

int main()
{
    int x = 19;
    (x & 1)? printf("Odd"): printf("Even");
    return 0;
 }
// Output: Odd
  • Schnellsuche Mindest von x und y ohne if else statment

Eg.

int min(int x, int y)
{
    return y ^ ((x ^ y) & - (x < y))
}
  • Dezimal zu binär Umwandlung

Eg.

#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 ;
}
  • Die XOR-Gatter-Verschlüsselung ist populäre Technik, becouse seiner complixblity und reare Verwendung durch den Programmierer.
    • bitweise XOR-Operator ist der nützlichste Operator aus technischen Interview Perspektive.

bitweise Verschiebung funktioniert nur mit + ve Zahl

Auch gibt es eine breite Nutzung von bitweise Logik

Es könnte helfen, es auf diese Art und Weise zu denken. Dies ist, wie AND (&) funktioniert:

Es im Grunde sagt sind diese beiden Zahlen diejenigen, wenn Sie also zwei Zahlen 5 und 3 werden sie in binäre und der Computer wird denken umgewandelt werden

         5: 00000101
         3: 00000011

sind beide ein: 00000001 0 ist falsch, 1 wahr

So das UND von 5 und 3 ist eins. Der OR (|). Operator macht das gleiche, außer nur einer der Zahlen muss man auf dem Ausgang 1, nicht beides sein

Ich hielt hören, wie langsam JavaScript Bitoperatoren waren. Ich habe einige Tests für meinen letzten Blog-Post und gefunden sie waren aus 40% bis 80% schneller als die arithmetische Alternative in mehreren Tests. Vielleicht benutzt sie langsam. In modernen Browsern, ich liebe sie.

Ich habe einen Fall in meinem Code, der schneller ist und einfacher, weil dieser zu lesen. Ich werde meine Augen offen halten für mehr.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top