जाओ << और >> ऑपरेटरों


124

क्या कोई मुझे <<और >>गो के उपयोग के बारे में समझा सकता है ? मुझे लगता है कि यह कुछ अन्य भाषाओं के समान है।

जवाबों:


169

सुपर (संभवतः अधिक) सरलीकृत परिभाषा सिर्फ यह <<है कि "बार 2" के लिए उपयोग किया जाता है और "2 से >>विभाजित" के लिए है - और इसके बाद की संख्या कितनी बार है।

तो n << x"एन टाइम्स 2, एक्स बार" है। और y >> z"2 से विभाजित है, z बार"।

उदाहरण के लिए, 1 << 5"1 बार 2, 5 बार" या 32 है। और 32 >> 5"32 को 2, 5 बार" या 1 से विभाजित किया गया है।

अन्य सभी उत्तर अधिक तकनीकी परिभाषा देते हैं, लेकिन किसी ने भी इसे वास्तव में स्पष्ट नहीं किया है और मुझे लगा कि आप ऐसा चाहते हैं।


7
यह एक बेहतरीन जवाब है। यह वास्तव में यह मेरे सिर में जम गया, धन्यवाद।
सैम ओरोज्को

2
इस तरह से उत्तर होना चाहिए।
उत्सव गुप्ता

103

Http://golang.org/doc/go_spec.html पर कल्पना से , ऐसा लगता है कि कम से कम पूर्णांक के साथ, यह एक द्विआधारी पारी है। उदाहरण के लिए, बाइनरी 0b00001000 >> 1 0b00000100 होगा, और 0b00001000 << 1 0b00010000 होगा।


जाओ स्पष्ट रूप से बाइनरी पूर्णांकों के लिए 0 बी नोटेशन को स्वीकार नहीं करता है। मैं सिर्फ उदाहरण के लिए इसका इस्तेमाल कर रहा था। दशमलव में, 8 >> 1 4 है, और 8 << 1 16 है। एक के द्वारा छोड़ा गया शिफ्टिंग 2 से गुणा के समान है, और एक से दाएं स्थानांतरण दो के द्वारा विभाजित होने के समान है, किसी भी शेष को छोड़ देना।


4
बहुत बढ़िया जवाब। यह बहुत मायने रखता है जब मुझे लगता है कि मैं इसे 2 (1 << शक्ति = 2 ^ शक्ति) की शक्तियों से निपटने वाले कोड में देख रहा था
स्टीफन स्मिथ

6
मुझे लगता है कि यह पूर्ण समीकरण होगा: (x << n == x * 2 ^ n) (x >> n == x * 2 ^ (- n))
सोमवार दिनांक

अच्छा जवाब, मैं बाइनरी शिफ्टिंग में पहले तो परेशान लग रहा था, लेकिन दशमलव को शक्तियों के साथ 2 में परिवर्तित करने से इसे प्राप्त करने में मदद मिलती है
मिन्हाजुल

31

<< और >> ऑपरेटर गो अंकगणितीय ऑपरेटर हैं

<<   left shift             integer << unsigned integer
>>   right shift            integer >> unsigned integer

शिफ्ट ऑपरेटर दाहिने ऑपरेंड द्वारा निर्दिष्ट शिफ्ट काउंट द्वारा बाएं ऑपरेंड को शिफ्ट करते हैं। वे अंकगणितीय पारियों को कार्यान्वित करते हैं यदि बायाँ संचालक एक हस्ताक्षरित पूर्णांक और तार्किक परिवर्तन होता है यदि यह एक अहस्ताक्षरित पूर्णांक है। शिफ्ट काउंट एक अहस्ताक्षरित पूर्णांक होना चाहिए। शिफ्ट काउंट पर कोई ऊपरी सीमा नहीं है। शिफ्ट्स ऐसा व्यवहार करते हैं जैसे कि बाएं ऑपरेंड को n की शिफ्ट काउंट के लिए 1 बार n द्वारा स्थानांतरित किया जाता है। परिणामस्वरूप, x << 1, x * 2 और x >> 1 के समान है, x / 2 के समान है, लेकिन नकारात्मक अनंत की ओर छोटा है।


10

वे मूल रूप से अंकगणित संचालक हैं और अन्य भाषाओं में इसका मूल पीएचपी, सी, गो उदाहरण है

जाओ

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;
}

C डेमो

पीएचपी

$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);
}

PHP डेमो

वे सभी उत्पादन करेंगे

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 

7

गो का << और >> दूसरी भाषाओं में बदलाव के समान है (जो है: 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

3
C और C ++ शिफ्ट ऑपरेटर्स के लिए, "व्यवहार सही नहीं है अगर सही ऑपरेंड नकारात्मक है, या पदोन्नत बाएं ऑपरेंड के बिट्स में लंबाई की तुलना में अधिक या बराबर है।" C और C ++ मानक इस बात की गारंटी नहीं देते हैं कि C और C ++ प्रोग्राम 5 और 20 को प्रिंट करेंगे।
peterSO

@peterSO: हाँ, आप सही हैं। मेरा दृष्टिकोण यह है कि प्रत्येक प्रोग्रामिंग भाषा मानक को एक ठोस सीपीयू पर एक ठोस कार्यान्वयन करना पड़ता है। एक एकल सीपीयू परिवार (x86-32) के संदर्भ में, सभी C / C ++ कंपाइलर का व्यवहार समान है (उम्मीद की जा सकती है)। इसका कारण यह है कि शिफ्ट ऑपरेटर को लागू करने के लिए ठीक 1 SHL / SHR / etc निर्देश का उत्सर्जन सबसे अच्छी बात है कि एक अनुकूलन C / C ++ कंपाइलर तब कर सकता है जब संदर्भ इसे 'x' और 'y' के बारे में कुछ नहीं बताता है। और, यदि कंपाइलर इस तथ्य के लिए जानता है कि कोड में अपरिभाषित व्यवहार है, तो उसे इसके बारे में उपयोगकर्ता को सूचित करना चाहिए।

2
मैं असहमत हूं। आपको पोर्टेबल कोड लिखना चाहिए। लिनक्स और विंडोज दोनों एआरएम पर चलते हैं। एकल सीपीयू परिवार पर ध्यान केंद्रित करना अदूरदर्शी है। इसके अलावा, y एक चर है। एक तथ्य के लिए, संकलक को इसके वास्तविक रनटाइम मूल्यों का कोई ज्ञान नहीं है।
पेट्रोएस

@Atom भाषा के अलावा क्या होगा, इसके बारे में कोई गारंटी नहीं दी जाती है, अपरिभाषित व्यवहार एकल संकलक के साथ एकल मशीन पर भी भिन्न होने की संभावना है, उदाहरण के लिए यदि आप संकलन विकल्प बदलते हैं (जैसे एक अनुकूलित निर्माण)। किसी भी तरह से इस पर भरोसा करना खतरनाक है गलत आईएमओ।
पॉल हैंकिन

@ अनाम हां, लेकिन यह केवल सिद्धांत है। जहां से अलग व्यवहार करने के लिए बदल रहा है संकलन विकल्प होता है कि आप एक ठोस उदाहरण प्रदान कर सकते हैं <<या >>सी / C ++?

6

<<बाईं पारी है >>जब बाएं ऑपरेंड एक हस्ताक्षरित पूर्णांक होता है, तो साइन-एक्सटेंडिंग राइट शिफ्ट होता है, और जब बाएं ऑपरेंड एक अहस्ताक्षरित पूर्णांक होता है, तो शून्य-विस्तारित राइट शिफ्ट होता है।

बेहतर ढंग से समझने >>के लिए

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 के अनुसार ऋणात्मक होता है पूरक हैं)।


3

में दशमलव गणित , जब हम गुणा या विभाजन 10 से , हम शून्य संख्या के अंत पर प्रभावित करते हैं।

में द्विआधारी , 2 एक ही प्रभाव पड़ता है। इसलिए हम अंत में एक शून्य जोड़ रहे हैं, या अंतिम अंक निकाल रहे हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.