2011-01-21 8 views
26

Rozumiem, że operator pojedynczego znaku ampersand jest zwykle używany do operacji bitowej AND. Czy jednak ktoś może pomóc w wyjaśnieniu interesujących wyników uzyskanych podczas porównywania dwóch liczb?Zrozumienie zachowania pojedynczego operatora i (i) na liczbach całkowitych

Na przykład;

(6 & 2) = 2 
(10 & 5) = 0 
(20 & 25) = 16 
(123 & 20) = 16 

Wygląda na to, że między tymi wynikami nie ma logicznego związku - czy czegoś brakuje? Dokumentacja online wydaje się odnosić tylko do porównania wartości binarnych lub pojedynczych bitów.

+1

Czy jesteś pewien (20 i 25) == 4? – Nick

+1

@Nick Mam to. –

+1

To, co widzisz *, jest * wynikiem operacji "bitowej AND". (Z wyjątkiem '(20 & 25) = 4' bit, który, jak zakładam, jest literówką.) – LukeH

Odpowiedz

46

Porównaj binarne reprezentacje każdego z nich.

110 &  010 =  010 
    1010 & 0101 = 0000 
    10100 & 11001 = 10000 
1111011 & 0010100 = 0010000 

W każdym przypadku cyfra jest 1 w wyniku tylko wtedy, gdy jest 1 po lewej i prawej stronie wejścia.

+0

+1: Wow, wszystkie operacje w tak krótkim czasie! – Rekin

+6

@Rekin: Dla małych liczb takich jak te, mogę konwertować między dziesiętnie, hexem i binarnie w mojej głowie, prawie. Znalazłem także róg, w którym można umieścić większość tabeli ASCII. –

+1

@Jefrrey, tylko z ciekawości - czy pracujesz w środowisku o niskim poziomie? Takie jak, powiedzmy, oprogramowanie do protokołów, wiadomości lub wydajności? – Rekin

6

trzeba konwertować swoje numery do reprezentacji binarnej, a następnie widać związek między wynikami jak 6 & 2 = 2 jest faktycznie 110 & 010 = 010 itd 5 to 1010 & 0101 = 0000

4

Binarny i operacja jest wykonywana na liczbach całkowitych, reprezentowane w systemie binarnym. Na przykład

110 (6) 
010 (2) 
-------- 
010 (2) 
2
6  = 0110 
2  = 0010 
6 & 2 = 0010 

20  = 10100 
25  = 11001 
20 & 25 = 10000 

(wygląda na to, że jesteś kalkulacja jest złe dla tego jednego)

Etc ...

2

Wewnętrznie Liczby są przechowywane w binary format. Sugeruję, żebyś o tym przeczytał. Znajomość bitowej reprezentacji liczb jest bardzo ważna.

Mając na uwadze powyższe, porównanie bitowe porównuje bity parametrów:

Decimal: 6 & 2 = 2 
Binary: 0110 & 0010 = 0010 
0

Bitwize i dopasowuje bitów w zapisie binarnym, jeden po drugim, a wynik jest bity, które są comOn pomiędzy dwoma numerami.

Aby przekonwertować liczbę na dwójkową, należy zrozumieć układ binarny.

Przykładowo 6 = 110 binarnego

sieciowym 110 reprezentuje 1x4 + 1x2 + 0x1 = 6

2, to jest 0x4 + 1x2 + 0x1 = 2.

Bitwize i tylko zachowuje pozycje, w których obie liczby mają ustawione położenie, w tym przypadku bit na 2, a wynik to 2.

Każdy dodatkowy bit jest dwukrotnie ostatni, więc 4-bitowa liczba używa mnożników 8, 4, 2, 1 i może t w tym przypadku reprezentują wszystkie liczby od 0 do 15 (suma mnożników.)

2

Bitowe ORAZ ma dokładnie to: wykonuje operację AND na bitach.

Aby przewidzieć wynik, należy spojrzeć na bity, a nie na liczby.

i daje 1, tylko jeśli jest 1 zarówno numer w tej samej pozycji:

6(110) & 2(010) = 2(010) 
10(1010) & 5(0101) = 0(0000) 

bitowym OR daje 1 jeśli istnieje 1 zarówno w liczbach w tej samej pozycji:

6(110) | 2(010) = 6(110) 
10(1010) | 5(0101) = 15(1111)