2013-06-23 14 views
30

Przeczytałem kilka przykładów kodu i natknąłem się na & na stronie internetowej Oracle na stronie Bit i Bit Shift Operatory. Moim zdaniem nie radził sobie zbyt dobrze z pracą wyjaśniającą bitowe &. Rozumiem, że operacja odbywa się bezpośrednio na tym samym bitwie, ale nie jestem pewien, jaki rodzaj operacji i zastanawiam się, co to za operacja. Oto przykładowy program, który dostałem ze strony internetowej Oracle: http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/java/nutsandbolts/examples/BitDemo.javaJak działa bitowe i (AND) działa w Javie?

+23

@jtahlborn Tego nie cierpię w przypadku niektórych użytkowników w SO. Dlaczego ktoś nie może najpierw zapytać w stackoverflow? Może mają jakąś wcześniejszą wiedzę, ale uważają, że stackoverflow jest najlepszym miejscem, aby uzyskać odpowiedzi. – Mukus

+0

@TejaswiRana - jeśli nie możesz samodzielnie znaleźć odpowiedzi na proste problemy w sieci, to zadawanie tych pytań i otrzymywanie odpowiedzi za pośrednictwem SO spowoduje więcej szkód niż korzyści. musisz najpierw nauczyć się znajdować odpowiedzi na proste rzeczy. czasami, aby naprawdę komuś pomóc, trzeba powiedzieć im trudną prawdę, a nie łatwe odpowiedzi. – jtahlborn

+13

@jtahlborn Jeśli ktoś zapyta mnie, na jakiej platformie iść na dworcu, dam im prostą odpowiedź. Nie wiem, czy to tylko ja, ale oczekuję tego samego od innych. Wiem, że ta osoba mogła przeszukać przed przybyciem na stację, ale fakt, że wiem, że mają więcej do zrobienia w życiu, niż słuchanie wykładu, nie ma żadnego sensu, aby dać im odpowiedź, ale łatwą. – Mukus

Odpowiedz

53

całkowita jest przedstawiony w postaci ciągu bitów w pamięci. Do interakcji z ludźmi komputer musi wyświetlać go jako cyfry dziesiętne, ale wszystkie obliczenia są wykonywane jako binarne. 123 w systemie dziesiętnym jest przechowywane w pamięci jako 1111011.

Operator & jest bitowym "I". Wynikiem są bity, które są włączane w obu liczbach. 1001 & 1100 = 1000, ponieważ tylko pierwszy bit jest włączony w obu.

Operator | jest bitowym "lub". Wynikiem są bity, które są włączane w dowolnej z liczb. 1001 | 1100 = 1101, ponieważ tylko drugi bit od prawej ma wartość zero w obu.

Istnieją również operatory ^ i ~, które są bitowo "Xor" i bitowo "Nie", odpowiednio. Wreszcie są operatory zmiany <<, >> i i .


Pod maską 123 przechowywany jest albo jako 01111011 00000000 00000000 00000000 lub 00000000 00000000 00000000 01111011 w zależności od systemu. Używanie operatorów bitowych, która reprezentacja jest używana, nie ma znaczenia, ponieważ obie reprezentacje są traktowane jako logiczna liczba 00000000000000000000000001111011. Pozbycie się zera wiodących liści 1111011.

+0

"123 w systemie dziesiętnym jest zapisywane jako 1111011 w pamięci" <- nie do końca prawda ... Maszyna może być małym endianem – fge

+5

Szczegóły implementacji. –

+0

O nie, nie do końca ... Nie w Javie. JVM maskuje różnicę dla ciebie. Ale w _memory_, reprezentacja zależy od endianness maszyny. Jest to bardzo daleko od bycia "szczegółem wdrożenia"! – fge

10

To binarny operator AND. Wykonuje operację AND, która jest częścią Boolean Logic, która jest powszechnie używana na liczbach binarnych podczas obliczeń.

Na przykład

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

Można również wykonać to w wielu bitowych liczb:

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

Jeśli rozwinąć dwie zmienne w zależności od ich kodzie szesnastkowym, są to:

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

Teraz proste bitowe i działanie skutkuje numer 0000 0000 0000 0010, która jest w jednostkach dziesiętnych 2. Jestem przy założeniu, wiesz jednak o podstawowych operacjach Boole'a i systemach liczbowych.

2

Jest to operacja logiczna dla wartości wejściowych. Aby zrozumieć przekonwertować wartości do postaci binarnej i gdzie bity bota w pozycji n mają wartość 1, wynik ma wartość 1. Na końcu następuje konwersja z powrotem.

Na przykład z tych przykładowych wartości:

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

Jeśli spojrzeć na dwóch liczb reprezentowanych w formacie binarnym, bitowym & tworzy trzeci numer, który ma 1 w każdym miejscu, że oba numery mają 1. (Wszędzie tam są zera).


Przykład:
0b10011011 &
0b10100010 =
0b10000010


Zauważ, że te pojawiają się tylko w miejscu, gdy oba argumenty mają jeden w tym miejscu.
Bitowe i są użyteczne, gdy każdy bit numeru przechowuje określoną informację.
Możesz również użyć ich do usunięcia/wyodrębnienia określonych sekcji liczb za pomocą masek.

-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

bitowe operatory oparte na zerach i jedynek, AND, LUB używane do tabeli prawdy na podstawie danych wyjściowych –

Powiązane problemy