C++: co robi (a<

Mam plik nagłówkowy C++, który zawiera następujące definicje:

#define CACHE_NUM_WAYS    (1<<1)
#define CACHE_DATA_SIZE   (1<<8)

Jest używany jako liczba całkowita w pozostałej części kodu.

Co to znaczy? A jaka jest jego wartość?
Author: plamut, 2012-06-11

5 answers

1

00000000 00000001 changes to 00000000 00000010

1

00000000 00000001 changes to 00000001 00000000
/ Align = "left" / Dla każdego 1 po prawej stronie możesz myśleć o sobie jako o pomnożeniu wartości po lewej przez 2. Zatem 2

Możesz również wykonać 4 > > 1 = 2 (i 5 > > 1 = 2 od zaokrąglenia w dół) jako operację odwrotną.

 22
Author: John Humphreys - w00te,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 15:29:46
 5
Author: Ran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 15:27:22

<< jest przesunięciem bitowym w lewo (istnieje również >> przesunięcie bitowe w prawo) jeśli masz 32-bitową liczbę całkowitą

1      = 00000000 00000000 00000000 00000001 = 1
1 << 1 = 00000000 00000000 00000000 00000010 = 2
1 << 8 = 00000000 00000000 00000001 00000000 = 256
 4
Author: jackdoe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 15:29:08

Operator << jest operatorem bitowym przesunięcia w lewo.

Więc kiedy piszesz 1<<17, binarna Reprezentacja 1 jest przesunięta w lewo o 17 bity jako:

//before (assume 1 is represented by 32-bit)
1 << 17  
0000 0000 0000 0000 0000 0000 0000 0001 << 17 (before - binary representation)

//after
0000 0000 0000 0010 0000 0000 0000 0000       (after - binary representation)
 3
Author: Nawaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 15:28:49

a<<b dla liczb całkowitych oznacza "przesunięcie w lewo". Bitowa reprezentacja a jest przesunięta w lewo b bitów. Jest to to samo co mnożenie przez (2 do potęgi b).

Więc w twoim przykładzie, (1<<1) jest 1*(2^1) jest 2, (1<<8) is 1*(2^8) is 256.

Warto zauważyć, że ogólnie rzecz biorąc, podobnie jak w przypadku innych operatorów w c++, << mogą być nadpisane do wykonywania innych funkcji. Domyślnie strumienie wejścia/wyjścia nadpisują ten operator, aby umożliwić pisanie zwięzłego kodu w celu wysłania kilka parametrów do strumienia. Więc możesz zobaczyć kod w ten sposób:

cout << something << somethingelse

I << Czy Nie oznacza w tym kontekście przesunięcie w lewo.

 3
Author: moonshadow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 15:32:42