जवाबों:
सुपर (संभवतः अधिक) सरलीकृत परिभाषा सिर्फ यह <<
है कि "बार 2" के लिए उपयोग किया जाता है और "2 से >>
विभाजित" के लिए है - और इसके बाद की संख्या कितनी बार है।
तो n << x
"एन टाइम्स 2, एक्स बार" है। और y >> z
"2 से विभाजित है, z बार"।
उदाहरण के लिए, 1 << 5
"1 बार 2, 5 बार" या 32 है। और 32 >> 5
"32 को 2, 5 बार" या 1 से विभाजित किया गया है।
अन्य सभी उत्तर अधिक तकनीकी परिभाषा देते हैं, लेकिन किसी ने भी इसे वास्तव में स्पष्ट नहीं किया है और मुझे लगा कि आप ऐसा चाहते हैं।
Http://golang.org/doc/go_spec.html पर कल्पना से , ऐसा लगता है कि कम से कम पूर्णांक के साथ, यह एक द्विआधारी पारी है। उदाहरण के लिए, बाइनरी 0b00001000 >> 1 0b00000100 होगा, और 0b00001000 << 1 0b00010000 होगा।
जाओ स्पष्ट रूप से बाइनरी पूर्णांकों के लिए 0 बी नोटेशन को स्वीकार नहीं करता है। मैं सिर्फ उदाहरण के लिए इसका इस्तेमाल कर रहा था। दशमलव में, 8 >> 1 4 है, और 8 << 1 16 है। एक के द्वारा छोड़ा गया शिफ्टिंग 2 से गुणा के समान है, और एक से दाएं स्थानांतरण दो के द्वारा विभाजित होने के समान है, किसी भी शेष को छोड़ देना।
<< और >> ऑपरेटर गो अंकगणितीय ऑपरेटर हैं ।
<< left shift integer << unsigned integer
>> right shift integer >> unsigned integer
शिफ्ट ऑपरेटर दाहिने ऑपरेंड द्वारा निर्दिष्ट शिफ्ट काउंट द्वारा बाएं ऑपरेंड को शिफ्ट करते हैं। वे अंकगणितीय पारियों को कार्यान्वित करते हैं यदि बायाँ संचालक एक हस्ताक्षरित पूर्णांक और तार्किक परिवर्तन होता है यदि यह एक अहस्ताक्षरित पूर्णांक है। शिफ्ट काउंट एक अहस्ताक्षरित पूर्णांक होना चाहिए। शिफ्ट काउंट पर कोई ऊपरी सीमा नहीं है। शिफ्ट्स ऐसा व्यवहार करते हैं जैसे कि बाएं ऑपरेंड को n की शिफ्ट काउंट के लिए 1 बार n द्वारा स्थानांतरित किया जाता है। परिणामस्वरूप, x << 1, x * 2 और x >> 1 के समान है, x / 2 के समान है, लेकिन नकारात्मक अनंत की ओर छोटा है।
वे मूल रूप से अंकगणित संचालक हैं और अन्य भाषाओं में इसका मूल पीएचपी, सी, गो उदाहरण है
जाओ
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)
}
}
सी
#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;
}
पीएचपी
$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);
}
वे सभी उत्पादन करेंगे
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
गो का << और >> दूसरी भाषाओं में बदलाव के समान है (जो है: 2 की शक्ति से विभाजन या गुणन), लेकिन क्योंकि गो C / C ++ की तुलना में अधिक सुरक्षित भाषा है, यह शिफ्ट काउंट एक संख्या होने पर कुछ अतिरिक्त काम करता है। ।
X86 सीपीयू में शिफ्ट निर्देश केवल 5 बिट्स (64-बिट x 86 सीपीयू पर 6 बिट्स) को शिफ्ट काउंट मानते हैं। C / C ++ जैसी भाषाओं में, शिफ्ट ऑपरेटर एक एकल CPU निर्देश में अनुवाद करता है।
निम्नलिखित गो कोड
x := 10
y := uint(1025) // A big shift count
println(x >> y)
println(x << y)
प्रिंट
0
0
जबकि C / C ++ प्रोग्राम प्रिंट होगा
5
20
<<
बाईं पारी है >>
जब बाएं ऑपरेंड एक हस्ताक्षरित पूर्णांक होता है, तो साइन-एक्सटेंडिंग राइट शिफ्ट होता है, और जब बाएं ऑपरेंड एक अहस्ताक्षरित पूर्णांक होता है, तो शून्य-विस्तारित राइट शिफ्ट होता है।
बेहतर ढंग से समझने >>
के लिए
var u uint32 = 0x80000000;
var i int32 = -2;
u >> 1; // Is 0x40000000 similar to >>> in Java
i >> 1; // Is -1 similar to >> in Java
इसलिए जब एक अहस्ताक्षरित पूर्णांक पर लागू किया जाता है, तो बाईं ओर के बिट शून्य से भरे होते हैं, जबकि जब हस्ताक्षर किए गए पूर्णांक पर लागू होते हैं, तो बाईं ओर के बिट बाईं ओर से भरे होते हैं (जो कि तब पूर्ण होता है जब हस्ताक्षर किए गए पूर्णांक 2 के अनुसार ऋणात्मक होता है पूरक हैं)।
में दशमलव गणित , जब हम गुणा या विभाजन 10 से , हम शून्य संख्या के अंत पर प्रभावित करते हैं।
में द्विआधारी , 2 एक ही प्रभाव पड़ता है। इसलिए हम अंत में एक शून्य जोड़ रहे हैं, या अंतिम अंक निकाल रहे हैं