Jawaban:
Definisi super (mungkin lebih) yang disederhanakan hanya <<
digunakan untuk "kali 2" dan >>
untuk "dibagi 2" - dan angka setelahnya adalah berapa kali.
Begitu n << x
juga dengan "n kali 2, x kali". Dan y >> z
adalah "y dibagi 2, z kali".
Misalnya, 1 << 5
adalah "1 kali 2, 5 kali" atau 32. Dan 32 >> 5
adalah "32 dibagi 2, 5 kali" atau 1.
Semua jawaban lain memberikan definisi yang lebih teknis, tetapi tidak ada yang menjelaskannya secara blak-blakan dan saya pikir Anda mungkin menginginkannya.
Dari spesifikasi di http://golang.org/doc/go_spec.html , tampaknya setidaknya dengan bilangan bulat, ini adalah pergeseran biner. misalnya, biner 0b00001000 >> 1 akan menjadi 0b00000100, dan 0b00001000 << 1 akan menjadi 0b00010000.
Go tampaknya tidak menerima notasi 0b untuk bilangan bulat biner. Saya hanya menggunakannya sebagai contoh. Dalam desimal, 8 >> 1 adalah 4, dan 8 << 1 adalah 16. Menggeser ke kiri dengan satu sama dengan mengalikan dengan 2, dan menggeser ke kanan dengan satu sama dengan membagi dua, membuang sisa.
Operator << dan >> adalah Operator Aritmatika Go .
<< left shift integer << unsigned integer
>> right shift integer >> unsigned integer
Operator shift menggeser operan kiri dengan hitungan shift yang ditentukan oleh operan kanan. Mereka mengimplementasikan pergeseran aritmatika jika operan kiri adalah bilangan bulat bertanda dan pergeseran logis jika itu adalah bilangan bulat tak bertanda. Hitungan shift harus berupa bilangan bulat unsigned. Tidak ada batasan atas jumlah shift. Pergeseran berperilaku seolah-olah operan kiri digeser n kali sebesar 1 untuk hitungan shift n. Akibatnya, x << 1 sama dengan x * 2 dan x >> 1 sama dengan x / 2 tetapi terpotong menuju tak terhingga negatif.
Mereka pada dasarnya adalah operator Aritmatika dan yang sama dalam bahasa lain di sini adalah Contoh dasar PHP, C, Go
PERGILAH
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);
}
Mereka semua akan menghasilkan
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 << dan >> mirip dengan shift (yaitu: pembagian atau perkalian dengan pangkat 2) dalam bahasa lain, tetapi karena Go adalah bahasa yang lebih aman daripada C / C ++ ia melakukan beberapa pekerjaan tambahan ketika jumlah shift berupa angka .
Instruksi shift pada CPU x86 hanya mempertimbangkan 5 bit (6 bit pada 64-bit CPU x86) dari hitungan shift. Dalam bahasa seperti C / C ++, operator shift diterjemahkan menjadi satu instruksi CPU.
Kode Go berikut
x := 10
y := uint(1025) // A big shift count
println(x >> y)
println(x << y)
cetakan
0
0
sementara program C / C ++ akan mencetak
5
20
<<
adalah shift kiri. >>
adalah pergeseran kanan yang memperpanjang tanda ketika operan kiri adalah bilangan bulat bertanda, dan pergeseran kanan yang memperpanjang nol ketika operan kiri adalah bilangan bulat yang tidak bertanda.
Untuk lebih memahami >>
pikirkan
var u uint32 = 0x80000000;
var i int32 = -2;
u >> 1; // Is 0x40000000 similar to >>> in Java
i >> 1; // Is -1 similar to >> in Java
Jadi ketika diterapkan ke bilangan bulat tak bertanda, bit di sebelah kiri diisi dengan nol, sedangkan bila diterapkan ke bilangan bulat bertanda, bit di sebelah kiri diisi dengan bit paling kiri (yaitu 1 ketika bilangan bulat bertanda negatif sesuai 2 melengkapi).
Dalam matematika desimal , saat kita mengalikan atau membagi dengan 10 , kita memberi pengaruh pada angka nol di ujung angka.
Dalam biner , 2 memiliki efek yang sama. Jadi kami menambahkan nol di akhir, atau menghapus digit terakhir