Yanıtlar:
Süper (muhtemelen aşırı) basitleştirilmiş tanım sadece <<
"çarpı 2" için kullanılır ve "2'ye >>
bölünmesi" için kullanılır - ve ondan sonraki sayı kaç kezdir.
Yani n << x
bir "n kere 2, x kere". Ve y >> z
"y bölü 2, z çarpı" dır.
Örneğin 1 << 5
, "1 kere 2, 5 kere" veya 32'dir. Ve 32 >> 5
"32 bölü 2, 5 kere" veya 1'dir.
Diğer tüm cevaplar daha teknik bir tanım veriyor, ama kimse bunu açıkça ortaya koymadı ve bunu isteyebileceğinizi düşündüm.
En spec itibaren http://golang.org/doc/go_spec.html , tamsayılar ile en azından bir ikili vardiya gibi görünüyor. örneğin, ikili 0b00001000 >> 1, 0b00000100 ve 0b00001000 << 1, 0b00010000 olacaktır.
Görünüşe göre Go, ikili tam sayılar için 0b gösterimini kabul etmiyor. Ben sadece örnek için kullanıyordum. Ondalık olarak, 8 >> 1 4'tür ve 8 << 1 16'dır. Bir sola kaydırmak, 2 ile çarpmakla aynıdır ve sağa kaydırmak ikiye bölmekle, kalanı atarak aynıdır.
<< ve >> operatörleri Go Aritmetik Operatörleri'dir .
<< left shift integer << unsigned integer
>> right shift integer >> unsigned integer
Kaydırma operatörleri, sol işleneni sağ işlenen tarafından belirtilen kaydırma sayısı kadar kaydırır. Sol işlenen işaretli bir tamsayı ise aritmetik kaydırma ve işaretsiz bir tamsayı ise mantıksal kaydırma uygularlar. Vardiya sayısı, işaretsiz bir tam sayı olmalıdır. Vardiya sayısında üst sınır yoktur. Kaydırmalar, sol işlenen n kez kaydırma sayısı için 1 kaydırılmış gibi davranır. Sonuç olarak, x << 1, x * 2 ile aynıdır ve x >> 1, x / 2 ile aynıdır, ancak negatif sonsuza doğru kesilmiştir.
Bunlar temelde Aritmetik operatörlerdir ve diğer dillerde de aynısı temel bir PHP, C, Go Örneği
GİT
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);
}
Hepsi çıktı
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'nun << ve >> diğer dillerdeki vardiyalara (yani: 2 kuvvetiyle bölme veya çarpma) benzer, ancak Go, C / C ++ 'dan daha güvenli bir dil olduğu için vardiya sayısı bir sayı olduğunda bazı ekstra işler yapar .
X86 CPU'lardaki kaydırma talimatları, kaydırma sayısının yalnızca 5 bitini (64 bit x86 CPU'larda 6 bit) dikkate alır. C / C ++ gibi dillerde, vardiya operatörü tek bir CPU talimatına çevrilir.
Aşağıdaki Go kodu
x := 10
y := uint(1025) // A big shift count
println(x >> y)
println(x << y)
baskılar
0
0
bir C / C ++ programı yazdırırken
5
20
<<
sol vardiyadır. >>
sol işlenen işaretli bir tamsayı olduğunda işaret genişleten sağa kaydırmadır ve sol işlenen işaretsiz bir tamsayı olduğunda sıfır genişleyen sağa kaydırmadır.
Daha iyi anlamak için >>
düşün
var u uint32 = 0x80000000;
var i int32 = -2;
u >> 1; // Is 0x40000000 similar to >>> in Java
i >> 1; // Is -1 similar to >> in Java
Dolayısıyla, işaretsiz bir tamsayıya uygulandığında, soldaki bitler sıfırla doldurulurken, işaretli bir tam sayıya uygulandığında, soldaki bitler en soldaki bit ile doldurulur (işaretli tam sayı, 2'ye göre negatif olduğunda 1'dir) Tamamlayıcı).
Gelen ondalık matematik , biz ne zaman çarpma veya bölme 10 oranında , biz numarasının ucunda sıfır etkisi.
In ikili , 2 aynı etkiye sahiptir. Bu yüzden sonuna sıfır ekliyoruz veya son basamağı kaldırıyoruz