जवाबों:
>>
अंकगणितीय पारी सही है, >>>
तार्किक बदलाव सही है।
अंकगणितीय पारी में, संख्या की हस्ताक्षर को संरक्षित करने के लिए साइन बिट का विस्तार किया जाता है।
उदाहरण के लिए: 8 बिट्स में -2 का प्रतिनिधित्व होगा 11111110
(क्योंकि सबसे महत्वपूर्ण बिट का नकारात्मक वजन है)। अंकगणितीय पारी का उपयोग करके इसे सही तरीके से स्थानांतरित करना आपको 11111111
या -1 देगा। तार्किक सही बदलाव, हालांकि, यह ध्यान नहीं देता है कि मूल्य संभवतः एक हस्ताक्षरित संख्या का प्रतिनिधित्व कर सकता है; यह बस सब कुछ दाईं ओर ले जाता है और 0 से बाईं ओर से भरता है। तार्किक बदलाव का उपयोग करके हमारे -2 सही एक बिट को बदलना होगा 01111111
।
2^k
, मुझे यह अजीब लगता है कि यह हर किसी का जवाब है। बिट्स की एक स्ट्रिंग एक संख्या नहीं है, और >>
हमेशा बिट्स के किसी भी स्ट्रिंग पर उपयोग किया जा सकता है: यह हमेशा एक ही बात करता है कि बिट्स का स्ट्रिंग खेल रहा है या नहीं और चाहे इसकी 'साइन' की अवधारणा हो। क्या आपके पहले से ही महान जवाब को मामले की चर्चा के साथ विस्तारित करना ठीक होगा जब आपके ऑपरेंड को एक हस्ताक्षरित संख्या के रूप में व्याख्या नहीं किया जा रहा है? क्या मेरी शिकायत समझ में आती है?
String
भी एक के रूप में माना जा सकता है char[]
। वह यह नहीं कह रहा है कि char
संख्या नहीं है; वह सिर्फ यह कह रहा है कि यह एक अहस्ताक्षरित संख्या है। मुझे लगता है कि वह कहाँ खो गया है।
>>>
अहस्ताक्षरित-शिफ्ट है; यह सम्मिलित करेगा 0. >>
हस्ताक्षरित है, और साइन बिट का विस्तार करेगा।
शिफ्ट ऑपरेटर्स में लेफ्ट शिफ्ट
<<
, राइट राइट शिफ्ट>>
और अहस्ताक्षरित राइट शिफ्ट शामिल हैं>>>
।का मान
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 से सबसे अधिक बिट्स जोड़े जाएंगे।
1 >>> 32 == 1
वे दोनों राइट-शिफ्ट हैं, लेकिन >>>
हैunsigned
से प्रलेखन :
अहस्ताक्षरित दाईं शिफ्ट ऑपरेटर ">>>" शून्य को सबसे बाईं स्थिति में स्थानांतरित करता है, जबकि ">>" के बाद सबसे बाईं स्थिति साइन एक्सटेंशन पर निर्भर करती है।
>>>
अहस्ताक्षरित है, लेकिन क्यों करता है 7>>32=7
? मैंने एक लूप चलाया जो एक समय में एक शिफ्ट किया और देखा कि 32
शिफ्ट होने के बाद , यह वापस आ गया 7
। एकमात्र तरीका जो यह समझ सकता है कि प्रत्येक संख्या को स्थानांतरित करने के लिए, यह "बाहरी सर्कल" में प्रवेश किया। 32
शिफ्ट होने के बाद , यह किसी तरह वापस अपनी स्थिति में पहुंच गया, लेकिन जाहिर है कि अभी भी इसका कोई मतलब नहीं है। क्या हो रहा है?
लॉजिकल राइट शिफ्ट ( 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
जब बिट्स दो-पूरक प्रतिनिधित्व में एक संख्या होती हैं, तो अंकगणितीय दाएं शिफ्ट में दो की शक्ति से विभाजित होने का प्रभाव होता है। यह काम करता है क्योंकि सबसे बाईं ओर साइन बिट है। दो की शक्ति से विभाजित होने से संकेत समान होना चाहिए।
बिटवाइज़ और बिट शिफ्ट ऑपरेटर्स के बारे में और पढ़ें
>> 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
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
राइट शिफ्ट लॉजिकल ऑपरेटर ( >>> N
) बिट्स को N पदों द्वारा दाईं ओर शिफ्ट करता है , साइन बिट को त्यागकर 0 के साथ N लेफ्ट-मोस्ट बिट्स को पेड करता है। उदाहरण के लिए:
-1 (in 32-bit): 11111111111111111111111111111111
एक >>> 1
ऑपरेशन बनने के बाद :
2147483647: 01111111111111111111111111111111
राइट शिफ्ट अंकगणितीय ऑपरेटर ( >> N
) भी N पदों द्वारा दाईं ओर बिट्स को स्थानांतरित करता है, लेकिन साइन बिट को संरक्षित करता है और 1 के साथ एन बाएं-सबसे बिट्स को पैड करता है। उदाहरण के लिए:
-2 (in 32-bit): 11111111111111111111111111111110
एक >> 1
ऑपरेशन बनने के बाद :
-1: 11111111111111111111111111111111