Odpowiedzi:
Super (prawdopodobnie nadmiernie) uproszczona definicja jest po prostu <<
używana do wyrażenia „razy 2” i >>
„podzielona przez 2” - a liczba po niej to ile razy.
Czyli n << x
„n razy 2, x razy”. I y >> z
jest "y podzielone przez 2, z razy".
Na przykład 1 << 5
to „1 razy 2, 5 razy” lub 32. A 32 >> 5
to „32 podzielone przez 2, 5 razy” lub 1.
Wszystkie inne odpowiedzi podają bardziej techniczną definicję, ale nikt nie przedstawił jej naprawdę dosadnie i pomyślałem, że możesz tego chcieć.
Ze specyfikacji na http://golang.org/doc/go_spec.html wynika, że przynajmniej w przypadku liczb całkowitych jest to przesunięcie binarne. na przykład binarne 0b00001000 >> 1 będzie równe 0b00000100, a 0b00001000 << 1 będzie równe 0b00010000.
Go najwyraźniej nie akceptuje notacji 0b dla binarnych liczb całkowitych. Użyłem go tylko jako przykład. W systemie dziesiętnym 8 >> 1 to 4, a 8 << 1 to 16. Przesunięcie w lewo o jeden jest tym samym, co pomnożenie przez 2, a przesunięcie w prawo o jeden to to samo, co podzielenie przez dwa, z odrzuceniem pozostałej części.
Operatory << i >> to operatory arytmetyczne Go .
<< left shift integer << unsigned integer
>> right shift integer >> unsigned integer
Operatory przesunięcia przesuwają lewy operand o liczbę przesunięć określoną przez prawy operand. Realizują przesunięcia arytmetyczne, jeśli lewy operand jest liczbą całkowitą ze znakiem, a przesunięcia logiczne, jeśli jest liczbą całkowitą bez znaku. Liczba przesunięć musi być liczbą całkowitą bez znaku. Nie ma górnej granicy liczby zmian. Przesunięcia zachowują się tak, jakby lewy operand został przesunięty n razy o 1 dla liczby przesunięć wynoszącej n. W rezultacie x << 1 to to samo, co x * 2, a x >> 1 to to samo, co x / 2, ale obcięte w kierunku ujemnej nieskończoności.
Są to w zasadzie operatory arytmetyczne i tak samo jest w innych językach. Oto podstawowy przykład PHP, C, Go
UDAĆ SIĘ
package main
import (
"fmt"
)
func main() {
var t , i uint
t , i = 1 , 1
for i = 1 ; i < 10 ; i++ {
fmt.Printf("%d << %d = %d \n", t , i , t<<i)
}
fmt.Println()
t = 512
for i = 1 ; i < 10 ; i++ {
fmt.Printf("%d >> %d = %d \n", t , i , t>>i)
}
}
do
#include <stdio.h>
int main()
{
int t = 1 ;
int i = 1 ;
for(i = 1; i < 10; i++) {
printf("%d << %d = %d \n", t, i, t << i);
}
printf("\n");
t = 512;
for(i = 1; i < 10; i++) {
printf("%d >> %d = %d \n", t, i, t >> i);
}
return 0;
}
PHP
$t = $i = 1;
for($i = 1; $i < 10; $i++) {
printf("%d << %d = %d \n", $t, $i, $t << $i);
}
print PHP_EOL;
$t = 512;
for($i = 1; $i < 10; $i++) {
printf("%d >> %d = %d \n", $t, $i, $t >> $i);
}
Wszystkie wyjdą
1 << 1 = 2
1 << 2 = 4
1 << 3 = 8
1 << 4 = 16
1 << 5 = 32
1 << 6 = 64
1 << 7 = 128
1 << 8 = 256
1 << 9 = 512
512 >> 1 = 256
512 >> 2 = 128
512 >> 3 = 64
512 >> 4 = 32
512 >> 5 = 16
512 >> 6 = 8
512 >> 7 = 4
512 >> 8 = 2
512 >> 9 = 1
Go << i >> są podobne do przesunięć (to znaczy: dzielenia lub mnożenia przez potęgę 2) w innych językach, ale ponieważ Go jest bezpieczniejszym językiem niż C / C ++, wykonuje dodatkową pracę, gdy liczba zmian jest liczbą .
Instrukcje zmiany w procesorach x86 uwzględniają tylko 5 bitów (6 bitów w 64-bitowych procesorach x86) liczby przesunięć. W językach takich jak C / C ++ operator shift tłumaczy na pojedynczą instrukcję procesora.
Poniższy kod Go
x := 10
y := uint(1025) // A big shift count
println(x >> y)
println(x << y)
wydruki
0
0
podczas gdy program C / C ++ będzie drukował
5
20
<<
to przesunięcie w lewo. >>
jest przesunięciem w prawo rozszerzającym znak, gdy lewy operand jest liczbą całkowitą ze znakiem, i przesunięciem w prawo rozszerzającym o zero, gdy lewy operand jest liczbą całkowitą bez znaku.
Aby lepiej zrozumieć, >>
pomyśl
var u uint32 = 0x80000000;
var i int32 = -2;
u >> 1; // Is 0x40000000 similar to >>> in Java
i >> 1; // Is -1 similar to >> in Java
Zatem po zastosowaniu do liczby całkowitej bez znaku bity po lewej stronie są wypełnione zerem, podczas gdy w przypadku liczby całkowitej ze znakiem, bity po lewej stronie są wypełniane bitem znajdującym się najbardziej po lewej stronie (czyli 1, gdy liczba całkowita ze znakiem jest ujemna, jak na 2 komplement).
W matematyce dziesiętnej , gdy mnożymy lub dzielimy przez 10 , wpływamy na zera na końcu liczby.
W binarnym , 2 ma ten sam efekt. Więc dodajemy zero na końcu lub usuwamy ostatnią cyfrę