2011-01-20 9 views
5

मुझे समझ नहीं नहीं क्यों यह मुझे एक ही जवाब देता है:बिट बदलाव

long long a = 3265917058 >> 24; 
std::cout << a << std::endl; //194 

long long ip = 3265917058; 
long long b = ip >> 24; 
std::cout << b << std::endl; //194 

लेकिन ऐसा नहीं:

long long a = (3265917058 << 16) >> 24; 
std::cout << a << std::endl; //240 

long long ip = 3265917058; 
long long b = (ip << 16) >> 24; 
std::cout << b << std::endl; //12757488 - **i want this to be 240 too!** 

अद्यतन: मैं 32 बिट पारी चाहते हैं, लेकिन कैसे कर सकते हैं मैं 32 बिट एक संख्या को बदलता हूं जो एक int चर के लिए बहुत बड़ा है? अद्यतन 2: मेरा जवाब हस्ताक्षरित int ip बनाना है। तो सब ठीक हो जाएगा।

उत्तर

7

आपका शाब्दिक स्थिर 3265917058 एक int है। एक LL प्रत्यय की उम्मीद behavio (यू) आर प्राप्त करने के लिए जोड़ें:

long long a = (3265917058LL << 16) >> 24; 
+0

लेकिन अगर मैं चर का उपयोग करता हूं तो मुझे जवाब 240 कैसे प्राप्त होगा? मैं int में 3265917058 स्टोर नहीं कर सकता। – Stals

+0

@Stals: आपका स्थिर अभी भी 32 बिट्स में फिट बैठता है - यह सिर्फ मॉड्यूलो 2^32 का इलाज करता है - थोड़ा प्रतिनिधित्व समान है। एक सभ्य संकलक आपको इसके बारे में चेतावनी देना चाहिए - क्या आपके पास चेतावनियां सक्षम हैं? –

+0

सक्षम, लेकिन कोई चेतावनी नहीं। – Stals

2

3265917058<<16 दोनों पक्षों int हैं, इसलिए आपरेशन int (32-बिट) में किया जाएगा।

आपको 3265917058LL<<16 की आवश्यकता है तो बाएं तरफ long long होगा और ऑपरेशन उस चौड़ाई यानी 64-बिट्स के साथ किया जाएगा।

1

प्राप्त करने के लिए क्या आप के लिए पूछना:

long long ip=3265917058; 
long long b= (static_cast<unsigned int>(ip)<<16)>> 24; 
std::cout<<b<<std::endl; // 240 

ध्यान दें कि परिणाम आपको मिल जाएगा (240) पोर्टेबल नहीं है। गणितीय रूप से, परिणाम 12757488 होना चाहिए। मूल्य 240 छंटनी के कारण है, और यह होने की गारंटी नहीं है। उदाहरण के लिए, यह उन सिस्टम पर नहीं होता है जहां int 64 बिट्स है।