Antworten:
Die super (möglicherweise über) vereinfachte Definition wird nur <<
für "mal 2" und >>
für "geteilt durch 2" verwendet - und die Zahl danach ist wie oft.
So n << x
ist "n mal 2, x mal". Und y >> z
ist "y geteilt durch 2, z-mal".
Zum Beispiel 1 << 5
ist "1 mal 2, 5 mal" oder 32. Und 32 >> 5
ist "32 geteilt durch 2, 5 mal" oder 1.
Alle anderen Antworten geben die technischere Definition, aber niemand hat sie wirklich unverblümt dargelegt, und ich dachte, Sie möchten das vielleicht.
Aus der Spezifikation unter http://golang.org/doc/go_spec.html geht hervor , dass es sich zumindest bei Ganzzahlen um eine binäre Verschiebung handelt. Beispiel: Binär 0b00001000 >> 1 wäre 0b00000100 und 0b00001000 << 1 wäre 0b00010000.
Go akzeptiert anscheinend die 0b-Notation für binäre Ganzzahlen nicht. Ich habe es nur für das Beispiel verwendet. In Dezimalzahlen ist 8 >> 1 4 und 8 << 1 16. Das Verschieben nach links um eins entspricht der Multiplikation mit 2, und das Verschieben nach rechts um eins entspricht dem Teilen durch zwei, wobei der Rest verworfen wird.
Die Operatoren << und >> sind Go-Arithmetik-Operatoren .
<< left shift integer << unsigned integer
>> right shift integer >> unsigned integer
Die Verschiebungsoperatoren verschieben den linken Operanden um die durch den rechten Operanden angegebene Verschiebungszahl. Sie implementieren arithmetische Verschiebungen, wenn der linke Operand eine vorzeichenbehaftete Ganzzahl ist, und logische Verschiebungen, wenn es sich um eine vorzeichenlose Ganzzahl handelt. Die Anzahl der Schichten muss eine Ganzzahl ohne Vorzeichen sein. Es gibt keine Obergrenze für die Schichtanzahl. Verschiebungen verhalten sich so, als ob der linke Operand bei einer Verschiebungszahl von n n-mal um 1 verschoben wird. Infolgedessen ist x << 1 dasselbe wie x * 2 und x >> 1 dasselbe wie x / 2, jedoch in Richtung negativer Unendlichkeit abgeschnitten.
Sie sind im Grunde genommen arithmetische Operatoren und in anderen Sprachen ist dies das gleiche Beispiel für PHP, C, Go
GEHEN
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)
}
}
C.
#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);
}
Sie würden alle ausgeben
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
Die << und >> von Go ähneln Verschiebungen (dh Division oder Multiplikation mit einer Potenz von 2) in anderen Sprachen, aber da Go eine sicherere Sprache als C / C ++ ist, erledigt es einige zusätzliche Arbeit, wenn die Anzahl der Schichten eine Zahl ist .
Verschiebungsanweisungen in x86-CPUs berücksichtigen nur 5 Bit (6 Bit auf 64-Bit-x86-CPUs) der Verschiebungsanzahl. In Sprachen wie C / C ++ übersetzt der Shift-Operator in einen einzelnen CPU-Befehl.
Der folgende Go-Code
x := 10
y := uint(1025) // A big shift count
println(x >> y)
println(x << y)
druckt
0
0
während ein C / C ++ - Programm drucken würde
5
20
<<
ist Linksverschiebung. >>
ist eine vorzeichenverlängernde Rechtsverschiebung, wenn der linke Operand eine vorzeichenbehaftete Ganzzahl ist, und eine nullverlängerende Rechtsverschiebung, wenn der linke Operand eine vorzeichenlose Ganzzahl ist.
Zum besseren Verständnis >>
denken
var u uint32 = 0x80000000;
var i int32 = -2;
u >> 1; // Is 0x40000000 similar to >>> in Java
i >> 1; // Is -1 similar to >> in Java
Wenn sie also auf eine vorzeichenlose Ganzzahl angewendet werden, werden die Bits links mit Null gefüllt, während bei Anwendung auf eine vorzeichenbehaftete Ganzzahl die Bits links mit dem Bit ganz links gefüllt werden (das 1 ist, wenn die vorzeichenbehaftete Ganzzahl gemäß 2 negativ ist ergänzen).
Wenn wir in der Dezimalmathematik mit 10 multiplizieren oder dividieren , bewirken wir die Nullen am Ende der Zahl.
In der Binärdatei hat 2 den gleichen Effekt. Also fügen wir am Ende eine Null hinzu oder entfernen die letzte Ziffer