2013-06-23 8 views
30

Ich habe einige Codebeispiele gelesen und stieß auf der Seite von Bitwise und Bit Shift Operators auf der Website von Oracle auf eine &. Meiner Meinung nach war es nicht gut, einen Job zu erklären, der die bitweise & erklärt. Ich verstehe, dass es eine Operation direkt auf das Bit, aber ich bin nur nicht sicher, welche Art von Operation, und ich frage mich, was diese Operation ist. Hier ist ein Beispielprogramm, das ich von der Oracle-Website bekommen habe: http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/java/nutsandbolts/examples/BitDemo.javaWie funktioniert das Bitwise & (UND) in Java?

+23

@jtahlborn Das ist, was ich an einigen der Benutzer in SO hasse. Warum kann man nicht zuerst im Stackoverflow fragen? Vielleicht haben sie ein gewisses Vorwissen, aber denken Sie, Stackoverflow ist der beste Ort, um ihre Antworten zu bekommen. – Mukus

+0

@TejaswiRana - Wenn Sie im Internet keine Antworten auf einfache Probleme finden können, dann wird das Beantworten dieser Fragen und das Erhalten der Antwort durch SO mehr Schaden als Nutzen anrichten. Sie müssen zuerst lernen, Antworten auf die einfachen Sachen zu finden. manchmal, um wirklich jemandem zu helfen, müssen Sie ihnen die harte Wahrheit sagen, nicht die einfachen Antworten. – jtahlborn

+13

@jtahlborn Wenn mich jemand fragt, auf welcher Plattform ich in einem Bahnhof bin, gebe ich ihnen die einfache Antwort. Ich weiß nicht, ob das nur ich ist, aber ich erwarte das auch von anderen. Ich weiß, dass diese Person gesucht haben könnte, bevor sie zur Station gekommen ist, aber die Tatsache, dass ich weiß, dass sie mehr im Leben zu tun haben, als jemandem Vortrag zu hören, ergibt keinen Sinn für mich, ihnen nur die leichte Antwort zu geben. – Mukus

Antwort

53

ganzzahlig ist als eine Folge von Bits im Speicher dargestellt. Für die Interaktion mit Menschen muss der Computer sie als Dezimalziffern anzeigen, aber alle Berechnungen werden als Binärwerte ausgeführt. 123 in Dezimal wird als 1111011 im Speicher gespeichert.

Der Operator & ist ein bitweises "And". Das Ergebnis sind die Bits, die in beiden Zahlen eingeschaltet sind. 1001 & 1100 = 1000, da nur das erste Bit in beiden eingeschaltet ist.

Der Operator | ist ein bitweises "Oder". Das Ergebnis sind die Bits, die in einer der Zahlen eingeschaltet sind. 1001 | 1100 = 1101, da nur das zweite Bit von rechts in beiden null ist.

Es gibt auch die Operatoren ^ und ~, die bitweise "Xor" bzw. bitweise "Not" sind. Schließlich gibt es die <<, >> und >>> Schaltbediener.


Unter der Motorhaube wird 123 entweder als 01111011 00000000 00000000 00000000 oder 00000000 00000000 00000000 01111011 gespeichert, je nach dem System. Bei Verwendung der bitweisen Operatoren ist es egal, welche Repräsentation verwendet wird, da beide Repräsentationen als die logische Zahl 00000000000000000000000001111011 behandelt werden. Entfernt führenden Nullen Blätter 1111011.

+0

"123 in Dezimal wird als 1111011 im Speicher gespeichert" <- nicht ganz wahr ... Die Maschine kann Little Endian sein – fge

+5

Implementierungsdetails. –

+0

Oh nein, nicht ganz so ... Nicht in Java. Die JVM maskiert den Unterschied für Sie. Aber in _memory_ hängt die Darstellung von der Endianess der Maschine ab. Es ist sehr wenig davon, ein "Implementierungsdetail" zu sein! – fge

10

Es ist ein binärer AND-Operator. Es führt eine UND-Operation aus, die ein Teil von Boolean Logic ist, die häufig für Binärzahlen in der Datenverarbeitung verwendet wird.

Zum Beispiel:

0 & 0 = 0 
0 & 1 = 0 
1 & 0 = 0 
1 & 1 = 1 

Sie können dies auch durchführen auf Mehrbit-Zahlen:

01 & 00 = 00 
11 & 00 = 00 
11 & 01 = 01 
1111 & 0101 = 0101 
11111111 & 01101101 = 01101101 
... 
3

Wenn Sie die beiden Variablen entsprechend ihrer Hex-Code erweitern, diese sind:

bitmask : 0000 0000 0000 1111 
val:  0010 0010 0010 0010 

nun eine einfache bitweise UND-Verknüpfung ergibt die Anzahl 0000 0000 0000 0010, die in Dezimaleinheiten ist 2. Ich gehe davon aus Sie kennen jedoch die grundlegenden booleschen Operationen und Zahlensysteme.

2

Es ist eine logische Operation für die Eingabewerte. Um zu verstehen, dass die Werte in die binäre Form konvertiert werden und wo Bot-Bits in Position n eine 1 haben, hat das Ergebnis eine 1. Am Ende zurück konvertieren.

Zum Beispiel mit den Beispielwerten:

0x2222 = 10001000100010 
0x000F = 00000000001111 
result = 00000000000010 => 0x0002 or just 2 
5

Wenn Sie auf zwei Zahlen binär dargestellt aussehen, ein bitweise & eine dritte Zahl erzeugt, die ein 1 an jeder Stelle hat, dass beide Zahlen haben einen 1. (Überall sonst gibt es Nullen).


Beispiel:
0b10011011 &
0b10100010 =
0b10000010


Beachten Sie, dass diejenigen, nur an einem Ort erscheinen, wenn beide Argumente eine Eins in diesem Ort haben.
Bitweises ands sind nützlich, wenn jedes Bit einer Nummer eine bestimmte Information speichert.
Sie können sie auch verwenden, um bestimmte Abschnitte von Nummern mithilfe von Masken zu löschen/zu extrahieren.

-1
import.java.io.*; 
import.java.util.*; 

public class Test { 
    public static void main(String[] args) { 
     int rmv,rmv1; 

     //this R.M.VIVEK complete bitwise program for java 
     Scanner vivek=new Scanner(); 
     System.out.println("ENTER THE X value"); 
     rmv = vivek.nextInt(); 
     System.out.println("ENTER THE y value"); 
     rmv1 = vivek.nextInt(); 

     System.out.println("AND table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv&rmv1);//11=1,10=0 
     System.out.println("OR table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv|rmv1);//10=1,00=0 
     System.out.println("xOR table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv^rmv1); 
     System.out.println("LEFT SWITH based to %d>>4=%d\n",rmv<<4); 
     System.out.println("RIGTH SWITH based to %d>>2=%d\n",rmv>>2); 

     for(int v=1;v<=10;v++) 
      System.out.println("LIFT SWITH based to (-NAGATIVE VALUE) -1<<%d=%p\n",i,-1<<1+i); 
    } 
} 
+0

die bitweisen Operatoren basierend auf Nullen und Einsen, UND, ODER verwendet, um die Wahrheitstabelle basierend auf der Ausgabe –