2013-07-21 14 views

Odpowiedz

15

Wyrażenie set >>= 1; oznacza set = set >> 1; to właściwe bity przesunięcie set przez 1 (samo postaci przypisany do >> bitowe przesunięcie w prawo kontroli operatora Bitwise Shift Operators).

Załóżmy, że jeśli set jest:

BIT NUMBER 31 n=27  m=17     0 
       ▼ ▼   ▼     ▼ 
set =   0000 1111 1111 1110 0000 0000 0000 0000 

Następnie po set >> = 1; zmienna set postać:

BIT NUMBER 31 n=26  m=16     0 
       ▼  ▼   ▼     ▼ 
set =   0000 0111 1111 1111 0000 0000 0000 0000 

Wskazówki liczba bitów przesunięte.

Uwaga ciekawy punkt: Ponieważ set jest unsigned long więc ta operacja powinna być logical shift>> (unsigned shift) logiczną shift nie zachowuje pewną liczbę za bitem znaku.

Dodatkowo, ponieważ przesuwasz wszystkie bity w prawo (w kierunku mniejszej liczby znaczącej), więc jedno przesunięcie w prawo to = dziel numer przez dwa.

check this code (tylko w celu wykazania ostatni punkt):

int main(){ 
unsigned long set = 268304384UL; 
set >>= 1; 
printf(" set :%lu \n", set); 
set = 268304384UL; 
set /= 2; 
printf(" set :%lu \n", set); 
return 1; 
} 

i wyjście:

set :134152192 
set :134152192 

(uwaga: jego nie oznacza >> i / są zarówno same)

Podobnie masz operatora <<= dla lewej zmiany, sprawdź inne dostępne Bitwise operators i Compound assignment operators, sprawdź także dział: bit expressions i różnicę między: signed/arithmetic shift and unsigned shift.

+0

dziękuję bardzo – Rotom92

+0

@ Rotom92 powitanie Rotom :) –

6

To "przesunięcie w prawo" to wartość o jeden bit. Jeśli przesuniesz wszystkie bity liczby całkowitej w prawo o 1, wtedy efektywnie "podzielisz przez 2", ponieważ binarny jest systemem numerowania base-2.

Wyobraź sobie, że numer 12 w formacie binarnym:

1100 = 12 in binary 
110 = 6 in binary (1100 right-shifted) 

Podobnie jak gdybyś przeniósł wszystkie cyfry w liczbie base-10 tuż przy jednej można byłoby podzielenie przez 10.

3

Każdy operator binarny można połączyć z =.We wszystkich przypadkach

dest op= expression 

jest równoważna

dest = dest op expression 

(chyba dest ma żadnych skutków ubocznych, to nastąpić tylko raz).

Więc to oznacza, że ​​

set>>=1; 

odpowiada:

set = set >> 1; 

Od >> jest operatorem, prawy shift, oznacza to przesunięcie wartości w set prawo o 1 bit.