2009-02-24 15 views
10

क्या कोई मुझे बता सकता है कि मास्क को दाहिने ओर क्यों नहीं बदला गया है? आप उस 1 के स्थान पर कुछ भी उपयोग कर सकते हैं और नतीजा वही होगा।यह बिटवाई शिफ्ट-दाएं क्यों काम नहीं करता है?

unsigned mask = ~0 >> 1; 
printf("%u\n", mask); 

उत्तर

25

यह एक प्रकार का मुद्दा है। आप अहस्ताक्षरित 0 डाली यदि यह ठीक हो जाओगे:

unsigned mask = ~ (unsigned) 0 >> 1; 
printf("%u\n", mask); 

टिप्पणी प्रति संपादित करें: या अहस्ताक्षरित शाब्दिक अंकन है, जो बहुत अधिक संक्षिप्त है का उपयोग करें। :)

unsigned mask = ~0u >> 1; 
printf("%u\n", mask); 
+2

या बस: "हस्ताक्षरित मास्क = ~ 0u >> 1;" यू प्रत्यय एक हस्ताक्षरित पूर्णांक इंगित करता है। – Skizz

+0

आह हाँ, वह भी। – chaos

+1

बिंगो! यह सवाल मेरे लिए मुश्किल था क्योंकि मुझे निहित प्रकार की जाति के बारे में पता नहीं था। पहले के जवाबों ने थोड़ा स्पष्ट नहीं किया। –

13

Sign extension

क्या हो रहा है ~0 है सभी बिट्स सेट (-1) के साथ एक पूर्णांक है। अब आप सही 1 द्वारा स्थानांतरित करें; चूंकि यह -1 है, साइन एक्सटेंशन उच्चतम बिट सेट रखता है, इसलिए यह हस्ताक्षरित रहा (यह वह नहीं है जिसे आप उम्मीद कर रहे थे)। फिर यह आपकी अपेक्षा की तरह हस्ताक्षरित रूपांतरित हो गया है।

2

~ 0 एक स्ट्रिंग है। >> ऑपरेटर उन्हें बदल देता है, और एक हस्ताक्षरित मूल्य में, यह लोगों को उच्च ऑर्डर बिट्स में बदल देता है। तो आप जो भी चाहते हैं उसे बदल सकते हैं, परिणाम नहीं बदलेगा।

4

इस प्रयास करें:

unsigned mask = (unsigned) ~0 >> 1; 
printf("%08x\n", mask); 

असाइनमेंट की आरएचएस एक हस्ताक्षरित मात्रा जब तक आप इसे डाली है, जो आप कलाकारों के बिना हस्ताक्षर विस्तार देख रहे थे मतलब है माना जाता है। (मैंने हेक्स में संख्या प्रदर्शित करने के लिए अपना प्रिंट स्टेटमेंट भी बदल दिया है, जो मेरे लिए डीकोड करना आसान है।)