>>> और >> के बीच अंतर


जवाबों:


408

>>अंकगणितीय पारी सही है, >>>तार्किक बदलाव सही है।

अंकगणितीय पारी में, संख्या की हस्ताक्षर को संरक्षित करने के लिए साइन बिट का विस्तार किया जाता है।

उदाहरण के लिए: 8 बिट्स में -2 का प्रतिनिधित्व होगा 11111110(क्योंकि सबसे महत्वपूर्ण बिट का नकारात्मक वजन है)। अंकगणितीय पारी का उपयोग करके इसे सही तरीके से स्थानांतरित करना आपको 11111111या -1 देगा। तार्किक सही बदलाव, हालांकि, यह ध्यान नहीं देता है कि मूल्य संभवतः एक हस्ताक्षरित संख्या का प्रतिनिधित्व कर सकता है; यह बस सब कुछ दाईं ओर ले जाता है और 0 से बाईं ओर से भरता है। तार्किक बदलाव का उपयोग करके हमारे -2 सही एक बिट को बदलना होगा 01111111


8
जबकि मैं सहमत हूं और सराहना करता हूं कि अंकगणितीय पारियों का उपयोग हस्ताक्षरित संख्याओं को गुणा करने के लिए किया जा सकता है 2^k, मुझे यह अजीब लगता है कि यह हर किसी का जवाब है। बिट्स की एक स्ट्रिंग एक संख्या नहीं है, और >>हमेशा बिट्स के किसी भी स्ट्रिंग पर उपयोग किया जा सकता है: यह हमेशा एक ही बात करता है कि बिट्स का स्ट्रिंग खेल रहा है या नहीं और चाहे इसकी 'साइन' की अवधारणा हो। क्या आपके पहले से ही महान जवाब को मामले की चर्चा के साथ विस्तारित करना ठीक होगा जब आपके ऑपरेंड को एक हस्ताक्षरित संख्या के रूप में व्याख्या नहीं किया जा रहा है? क्या मेरी शिकायत समझ में आती है?
जिग्गी

11
आप क्यों कहते हैं कि बिट्स की एक स्ट्रिंग एक संख्या नहीं है? क्या आप कहेंगे कि दशमलव अंकों का एक क्रम संख्या नहीं है?
डेनबेन

4
@danben चर्चा करता है कि क्या यह एक संख्या है या नहीं केवल एक अर्थ है यदि आप इसे किसी संदर्भ से जोड़ते हैं। अगर इंटरनेट सिर्फ बिजली है, तो मैं मानता हूं कि एक स्ट्रिंग सिर्फ एक संख्या है।
bvdb

1
@danben लेकिन वास्तव में, मुझे लगता है कि जिग्गी वास्तव में किस तरह का उल्लेख कर रही थी (इम्हो), यह Stringभी एक के रूप में माना जा सकता है char[]। वह यह नहीं कह रहा है कि charसंख्या नहीं है; वह सिर्फ यह कह रहा है कि यह एक अहस्ताक्षरित संख्या है। मुझे लगता है कि वह कहाँ खो गया है।
bvdb

5
@Ziggy सही है: बिट्स के प्रत्येक स्ट्रिंग एक संख्या नहीं है, और दशमलव अंकों का प्रत्येक अनुक्रम एक संख्या नहीं है। उदाहरण के लिए: टेलीफोन नंबर, पोस्ट कोड (कई देशों में) आदि दशमलव अंकों के तार हैं, लेकिन यह उन्हें जोड़ने, घटाने या गुणा करने का कोई मतलब नहीं है, इसलिए वे वास्तव में संख्या नहीं हैं। वे दशमलव अंकों के तार होते हैं, लेकिन उन्हें वर्णों के तार के रूप में माना जाना चाहिए। (कनाडा और यूके में पोस्ट कोड में अक्षर और अंक शामिल हैं।)
jcsahnwaldt का कहना है कि GoFundMonica

102

>>>अहस्ताक्षरित-शिफ्ट है; यह सम्मिलित करेगा 0. >>हस्ताक्षरित है, और साइन बिट का विस्तार करेगा।

JLS 15.19 शिफ्ट ऑपरेटर

शिफ्ट ऑपरेटर्स में लेफ्ट शिफ्ट <<, राइट राइट शिफ्ट >>और अहस्ताक्षरित राइट शिफ्ट शामिल हैं >>>

का मान n>>sहै nसही-स्थानांतरित sसाथ बिट पदों साइन-विस्तार

का मान n>>>sहै nसही-स्थानांतरित sसाथ बिट पदों शून्य विस्तार

    System.out.println(Integer.toBinaryString(-1));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >> 16));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >>> 16));
    // prints "1111111111111111"

सकारात्मक प्रतिपक्ष जोड़कर चीजों को और अधिक स्पष्ट करने के लिए

System.out.println(Integer.toBinaryString(121));
// prints "1111001"
System.out.println(Integer.toBinaryString(121 >> 1));
// prints "111100"
System.out.println(Integer.toBinaryString(121 >>> 1));
// prints "111100"

चूंकि यह सकारात्मक है कि दोनों हस्ताक्षरित और अहस्ताक्षरित शिफ्टों में 0 से सबसे अधिक बिट्स जोड़े जाएंगे।

संबंधित सवाल


आपके उदाहरणों के बिना, मुझे नहीं मिलेगा।
mr5

47

वे दोनों राइट-शिफ्ट हैं, लेकिन >>>हैunsigned

से प्रलेखन :

अहस्ताक्षरित दाईं शिफ्ट ऑपरेटर ">>>" शून्य को सबसे बाईं स्थिति में स्थानांतरित करता है, जबकि ">>" के बाद सबसे बाईं स्थिति साइन एक्सटेंशन पर निर्भर करती है।


12
क्या आप एक उदाहरण के साथ समझा सकते हैं
कसुन सियामबलपिटिया

1
मुझे भी लगता है कि आपको एक उदाहरण देना चाहिए।
बक्सर

मुझे लगता है कि >>>अहस्ताक्षरित है, लेकिन क्यों करता है 7>>32=7? मैंने एक लूप चलाया जो एक समय में एक शिफ्ट किया और देखा कि 32शिफ्ट होने के बाद , यह वापस आ गया 7। एकमात्र तरीका जो यह समझ सकता है कि प्रत्येक संख्या को स्थानांतरित करने के लिए, यह "बाहरी सर्कल" में प्रवेश किया। 32शिफ्ट होने के बाद , यह किसी तरह वापस अपनी स्थिति में पहुंच गया, लेकिन जाहिर है कि अभी भी इसका कोई मतलब नहीं है। क्या हो रहा है?
इयान लिमता

@IanLimarta यह नहीं है? मुझे बस 0. मिलता है ( for (int i = 7 << 1, j = 0; j < 32; j++) System.out.println(Integer.toString(i >>= 1, 2));) यदि आपका मतलब है कि >>32खुद मूल मूल्य क्यों लौटाता है, तो यह देखें ।
Moira

मुझे माफ कर दो। मेरा मतलब था कि '7 >>> 32 = 7' क्यों है।
इयान लिमार्टा

40

लॉजिकल राइट शिफ्ट ( v >>> n) एक मान लौटाता है जिसमें बिट्स को बिट पोजिशन vसे दाईं ओर शिफ्ट किया गया है n, और 0 को लेफ्ट साइड से शिफ्ट किया गया है। बाइनरी में लिखे गए 8-बिट मानों को स्थानांतरित करने पर विचार करें:

01111111 >>> 2 = 00011111
10000000 >>> 2 = 00100000

यदि हम बिट्स को एक अहस्ताक्षरित पूर्णांक के रूप में व्याख्यायित करते हैं, तो तार्किक सही बदलाव की संख्या को 2 की इसी शक्ति से विभाजित करने का प्रभाव होता है। हालांकि, यदि संख्या दो-पूरक प्रतिनिधित्व में है, तो तार्किक सही बदलाव नकारात्मक संख्याओं को सही ढंग से विभाजित नहीं करता है। । उदाहरण के लिए, बिट्स को अहस्ताक्षरित संख्याओं के रूप में व्याख्या किए जाने पर दूसरी सही बदलाव 128 से 32 पार कर जाता है। लेकिन यह -128 से 32 तक स्थानांतरित हो जाता है, जैसा कि जावा में विशिष्ट है, बिट्स की व्याख्या दो पूरक में की जाती है।

इसलिए, यदि आप दो की शक्ति से विभाजित करने के लिए शिफ्ट कर रहे हैं, तो आप अंकगणितीय सही बदलाव ( v >> n) चाहते हैं। यह एक ऐसा मान देता है जिसमें बिट्स को बिट पदों पर vदाईं ओर स्थानांतरित कर दिया गया है n, और सबसे बाईं ओर के बिट की प्रतियां बाईं ओर से स्थानांतरित की जाती हैं:

01111111 >> 2 = 00011111
10000000 >> 2 = 11100000

जब बिट्स दो-पूरक प्रतिनिधित्व में एक संख्या होती हैं, तो अंकगणितीय दाएं शिफ्ट में दो की शक्ति से विभाजित होने का प्रभाव होता है। यह काम करता है क्योंकि सबसे बाईं ओर साइन बिट है। दो की शक्ति से विभाजित होने से संकेत समान होना चाहिए।


38

>>>हमेशा बाईं ओर 0 में सबसे अधिक >>रखा जाएगा , जबकि यह संकेत क्या है के आधार पर 1 या 0 लगाएगा।


10

बिटवाइज़ और बिट शिफ्ट ऑपरेटर्स के बारे में और पढ़ें

>>      Signed right shift
>>>     Unsigned right shift

बिट पैटर्न बाएं हाथ के ऑपरेंड द्वारा दिया जाता है, और दाएं हाथ के ऑपरेंड द्वारा शिफ्ट करने के लिए पदों की संख्या। अहस्ताक्षरित दाईं शिफ्ट ऑपरेटर शून्य को सबसे बाईं स्थिति में स्थानांतरित करता >>> है ,

>>साइन एक्सटेंशन पर निर्भर होने के बाद सबसे बाईं स्थिति ।

सरल शब्दों में >>>हमेशा एक शून्य को सबसे बाईं स्थिति में>> शिफ्ट किया जाता है जबकि संख्या के संकेत के आधार पर बदलाव होता है अर्थात नकारात्मक संख्या के लिए 1 और सकारात्मक संख्या के लिए 0।


उदाहरण के लिए नकारात्मक और सकारात्मक संख्याओं के साथ प्रयास करें।

int c = -153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.println(Integer.toBinaryString(c <<= 2));

System.out.println();

c = 153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));

उत्पादन:

11111111111111111111111111011001
11111111111111111111111101100100
  111111111111111111111111011001
11111111111111111111111101100100

                          100110
                        10011000
                          100110
                        10011000

धन्यवाद। बस Integer.MAX_VALUE, Integer.MIN_VALUE, -1, 0, 1 के लिए बिट प्रतिनिधित्व को संदर्भित करने के लिए एक टिप्पणी जोड़ना चाहते हैं । जैसे System.out.println(Integer.MAX_VALUE + ": " + String.format("%32s", Integer.toBinaryString(Integer.MAX_VALUE)).replace(' ', '0')):; Integer.MAX_VALUE : 01111111111111111111111111111111; Integer.MIN_VALUE : 10000000000000000000000000000000; -1 : 11111111111111111111111111111111; 0 : 00000000000000000000000000000000; 1 : 00000000000000000000000000000001
एंडी डोंग

6

राइट शिफ्ट लॉजिकल ऑपरेटर ( >>> N) बिट्स को N पदों द्वारा दाईं ओर शिफ्ट करता है , साइन बिट को त्यागकर 0 के साथ N लेफ्ट-मोस्ट बिट्स को पेड करता है। उदाहरण के लिए:

-1 (in 32-bit): 11111111111111111111111111111111

एक >>> 1ऑपरेशन बनने के बाद :

2147483647: 01111111111111111111111111111111

राइट शिफ्ट अंकगणितीय ऑपरेटर ( >> N) भी N पदों द्वारा दाईं ओर बिट्स को स्थानांतरित करता है, लेकिन साइन बिट को संरक्षित करता है और 1 के साथ एन बाएं-सबसे बिट्स को पैड करता है। उदाहरण के लिए:

-2 (in 32-bit): 11111111111111111111111111111110

एक >> 1ऑपरेशन बनने के बाद :

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