2009-04-10 11 views
15

क्या कोई समझा सकता है कि निम्नलिखित संकलित क्यों नहीं करते?बाएं बिट स्थानांतरण 255 (बाइट के रूप में)

byte b = 255 << 1 

त्रुटि:

Constant value '510' cannot be converted to a 'byte'

मैं द्विआधारी में निम्नलिखित की उम्मीद कर रहा हूँ:

1111 1110 

जैसे रूपांतरण मुझे स्टम्प्ड गया है।

उत्तर

35

सी # में संख्यात्मक अक्षर int हैं, byte नहीं (और बिट शिफ्ट का संकलन कंपाइलर द्वारा मूल्यांकन किया जाएगा, इसलिए केवल 510 अवशेष)। इसलिए आप byte पर एक मान असाइन करने का प्रयास कर रहे हैं जो फिट नहीं है। आप 255:

byte b = (255 << 1) & 0xFF 

परिणाम 8 बिट्स के परिणाम को कम करने के लिए मुखौटा कर सकते हैं। जावा के विपरीत, सी # ओवरफ्लक्टेड द्वारा ओवरफ्लो जाने की अनुमति नहीं देता है। मूल रूप से आपके पास बाइट को 510 असाइन करने का प्रयास करते समय दो समझदार विकल्प होंगे: या तो अधिकतम मूल्य पर क्लैंप करें, फिर आपको 255 मिलेंगे, या फिट बैठने वाली बिट्स को फेंक दें, इस मामले में आपको 254 मिलेंगे।

तुम भी unchecked, lassevk mentioned के रूप में उपयोग कर सकते हैं:

byte b = unchecked((byte)(255 << 1)); 
+0

मुझे यकीन नहीं है कि मैंने क्यों सोचा था कि 255 को 8 बिट –

+0

के रूप में संग्रहीत किया जाएगा, ठीक है, 255 फिट बैठता है, उपर्युक्त सब कुछ नहीं है :) – Joey

+4

यह ध्यान दिया जाना चाहिए, क्योंकि मुझे यहां किसी अन्य थ्रेड से धक्का दिया गया था, भले ही आपके पास दो बाइट हैं, उन पर कोई भी bitwise ऑपरेशन एक int वापस आ जाएगा। –

1
255 << 1 

आपको एक से अधिक बाइट देगा।

1

क्या आपने इसे कास्ट करने का प्रयास किया है?

byte b = (byte)(255 << 1) 

यह एक दिलचस्प दृष्टिकोण है - अगर एक unchecked ब्लॉक इस तरह में लिपटे ऊपर कोड काम करेगा:

unchecked 
{ 
    byte b = (byte)(255 << 1); 
} 

चूंकि यह unchecked है मूल्य का इरादा मूल्य को छोटा किया गया है 254. तो यह एक कलाकार के साथ ऐसा करना संभव है!

+0

-1 आप डाली नहीं कर सकते, यह संकलन भी नहीं करेंगे। –

+0

शायद आपका मतलब है (बाइट) (255 << 1)? – finnw

+1

आज़माएं: बाइट बी = (255 << 1) & 0xff; – Joel

8

आप 255 को 1 बिट से स्थानांतरित कर रहे हैं, फिर इसे बाइट को असाइन करने का प्रयास कर रहे हैं। 255 << 1 is 510, और 510 बाइट में फिट नहीं होंगे।

5

<< ऑपरेटर का परिणाम एक Int32, नहीं क्या आप इसे में डाल दिया है।

आपको शिफ्ट का परिणाम डालना होगा, इनपुट नहीं। इसके अतिरिक्त, यह एक अतिप्रवाह उत्पन्न करेगा (यह बाद में बाइट से बड़ा है), इसलिए आपको यह निर्दिष्ट करने की आवश्यकता है कि आपको एक अनचेक कास्ट चाहिए।

दूसरे शब्दों में, यह काम करेगा:

Byte b = unchecked((Byte)(255 << 1)); 
0

और < < के बाद से किया गया है & तुलना में एक उच्च पूर्वता आप कोष्ठक बचा सकते हैं:

byte b = 255 << 1 & 0xff; 
संबंधित मुद्दे