<< এবং >> অপারেটরগুলি যান


124

কেউ দয়া করে আমাকে গো <<এবং এর ব্যবহার সম্পর্কে ব্যাখ্যা করতে পারেন >>? আমার ধারণা এটি অন্য কয়েকটি ভাষার মতো similar

উত্তর:


168

সুপার (সম্ভবত ওভার) সরলিকৃত সংজ্ঞাটি হ'ল <<"বার 2" এর জন্য ব্যবহৃত হয় এবং >>এটি "2 দ্বারা বিভক্ত" - এবং এর পরে সংখ্যাটি কতবার হয়।

সুতরাং n << x"এন বার 2, এক্স বার"। এবং y >> z"y 2 দ্বারা ভাগ করা হয়, z বার"।

উদাহরণস্বরূপ, 1 << 5"1 বার 2, 5 বার" বা 32 And 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 one


4
দুর্দান্ত উত্তর। এটি অনেক অর্থবহ হয়ে যায় যখন আমি মনে করি যে আমি 2 (1 << পাওয়ার = 2 ^ পাওয়ার) এর ক্ষমতার সাথে কোডের কোডটি দেখেছিলাম
স্টিফেন স্মিথ

6
আমি মনে করি এটি সম্পূর্ণ সমীকরণ হবে: (x << n == x * 2 ^ n) (x >> n == x * 2 ^ (- এন))
সোমবারের কাগজ

সুন্দর উত্তর, আমি বাইনারি স্থানান্তর প্রথমে ঝামেলা মনে হয়েছিল তবে 2
টির

31

<< এবং >> অপারেটররা হলেন গো অ্যারিম্যাটিক অপারেটর

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

শিফট অপারেটরগুলি ডান অপারেন্ড দ্বারা নির্দিষ্ট শিফট গণনা দ্বারা বাম অপারেন্ডকে স্থানান্তরিত করে। বাম অপারেন্ডটি স্বাক্ষরিত পূর্ণসংখ্যা এবং লজিকাল শিফট যদি এটি স্বাক্ষরবিহীন পূর্ণসংখ্য হয় তবে তারা গাণিতিক শিফটগুলি বাস্তবায়ন করে। শিফট গণনাটি একটি স্বাক্ষরবিহীন পূর্ণসংখ্যার হতে হবে। শিফ্ট কাউন্টে কোনও উচ্চতর সীমা নেই। শিফটগুলি এমনভাবে আচরণ করে যেন বাম ক্রিয়াকলাপটি n এর শিফ্ট কাউন্টের জন্য 1 দ্বারা 1 বার স্থানান্তরিত হয়। ফলস্বরূপ, x << 1 এক্স x 2 এবং x >> 1 এর সমান তবে নেতিবাচক অনন্তের দিকে ছাঁটা হয়েছে।


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

সি ডেমো

পিএইচপি

$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 

7

গো এর << এবং >> অন্যান্য ভাষায় শিফটের সমান (যা: 2 এর শক্তির দ্বারা বিভাজন বা গুণন) তবে সি / সি ++ এর চেয়ে গো সুরক্ষিত ভাষা হওয়ায় শিফট গণনাটি যখন একটি সংখ্যা হয় তখন এটি কিছু অতিরিক্ত কাজ করে ।

X86 সিপিইউগুলিতে শিফট নির্দেশাবলী শিফট গণনার মাত্র 5 বিট (-৪ বিট x86 সিপিইউতে 6 বিট) বিবেচনা করে। সি / সি ++ এর মতো ভাষায় শিফট অপারেটর একটি সিপিইউ নির্দেশে অনুবাদ করে।

নিম্নলিখিত গো কোড

x := 10
y := uint(1025)  // A big shift count
println(x >> y)
println(x << y)

কপি করে প্রিন্ট

0
0

যখন একটি সি / সি ++ প্রোগ্রাম মুদ্রণ করবে

5
20

3
সি এবং সি ++ শিফট অপারেটরদের জন্য, "ডান অপরেন্ডটি নেতিবাচক, বা প্রচারিত বাম অপারেন্ডের বিটগুলির দৈর্ঘ্যের চেয়ে বড় বা সমান হলে আচরণটি অপরিজ্ঞাত।" সি এবং সি ++ মানদণ্ডগুলি গ্যারান্টি দেয় না যে সি এবং সি ++ প্রোগ্রামগুলি 5 এবং 20 মুদ্রণ করবে
পিটারএসও

@ পিটারসো: হ্যাঁ, আপনি ঠিক বলেছেন। আমার অবস্থানটি হ'ল প্রতিটি প্রোগ্রামিং ল্যাঙ্গুয়েজ স্ট্যান্ডার্ডের একটি কংক্রিট সিপিইউতে একটি কংক্রিট বাস্তবায়ন করতে হবে। একক সিপিইউ পরিবার (x86-32) এর প্রসঙ্গে, সমস্ত সি / সি ++ সংকলকগুলির আচরণ একই রকম (আশা করা যায়)। এর কারণ হ'ল শিফট অপারেটরটি বাস্তবায়নের জন্য ঠিক 1 এসএইচএল / এসএইচআর / ইত্যাদি নির্দেশ নির্গমন করাই সর্বোত্তম জিনিস যা কোনও অনুকূলকরণ সি / সি ++ সংকলক করতে পারে যখন প্রসঙ্গটি 'এক্স' এবং 'ওয়াই' সম্পর্কে কিছু না জানায়। এবং, যদি সংকলক কোডটির অপরিবর্তিত আচরণের কোনও সত্যের জন্য জেনে থাকে তবে এটি ব্যবহারকারীকে এটি সম্পর্কে অবহিত করা উচিত।

2
আমি একমত নই আপনার পোর্টেবল কোড লেখা উচিত। লিনাক্স এবং উইন্ডোজ উভয়ই এআরএম-এ চলে। একক সিপিইউ পরিবারে দৃষ্টি নিবদ্ধ করা স্বল্পদৃষ্টির। এছাড়াও, y একটি পরিবর্তনশীল। প্রকৃতপক্ষে, সংকলকটির প্রকৃত রানটাইম মানগুলির কোনও জ্ঞান নেই।
পিটারএসও

@ অ্যাটম ভাষাটি কী ঘটবে তা সম্পর্কে কোনও গ্যারান্টি সরবরাহ না করে, অপরিজ্ঞাত আচরণটি একটি একক মেশিনে এমনকি একটি সংকলক সহ পৃথক হতে পারে, উদাহরণস্বরূপ যদি আপনি সংকলনের বিকল্পগুলি পরিবর্তন করেন (যেমন একটি অনুকূলিত বিল্ড)। এটা জানানোর কোন ভাবেই আইএমও বিপজ্জনকভাবে ভুল।
পল হ্যাঙ্কিন

@ অজ্ঞাতনামা হ্যাঁ, তবে এটি কেবল তত্ত্ব। যেখানে বিভিন্ন আচরণের পরিবর্তন সংকলন অপশন বিশালাকার আপনি একটি কংক্রিট উদাহরণ প্রদান করতে পারেন <<বা >>সি / 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

সুতরাং যখন স্বাক্ষরবিহীন পূর্ণসংখ্যার সাথে প্রয়োগ করা হয়, বামদিকে বিটগুলি শূন্য দ্বারা পূর্ণ হয়, যখন একটি স্বাক্ষরিত পূর্ণসংখ্যার সাথে প্রয়োগ করা হয়, বামদিকে বিটগুলি বামদিকের বিট দিয়ে পূর্ণ হয় (যা 1 এর মধ্যে স্বাক্ষরিত পূর্ণসংখ্যা 2 এর হিসাবে নেতিবাচক থাকে) পরিপূর্ণ)।


3

ইন দশমিক গণিত , যখন আমরা সংখ্যাবৃদ্ধি বা ডিভাইড 10 দ্বারা , আমরা শূন্য সংখ্যা প্রান্তে প্রভাব।

ইন বাইনারি , 2 একই প্রভাব রয়েছে। সুতরাং আমরা শেষের দিকে একটি শূন্য যুক্ত করছি, বা শেষ সংখ্যাটি সরিয়ে দিচ্ছি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.