2010-06-08 11 views
7

मैं सी ++ में किसी संख्या के साइन बिट तक पहुंचने में सक्षम होना चाहता हूं।मैं सी ++ में किसी संख्या के साइन बिट तक कैसे पहुंच सकता हूं?

int sign bit = number >> 31; 

काम करने के लिए प्रकट होता है यह मेरे ऋणात्मक संख्याओं के लिए सकारात्मक संख्या के लिए 0 और -1 दे रही है: मेरे वर्तमान कोड कुछ इस तरह लग रहा है। हालांकि, मैं नहीं दिख रहा है कि कैसे मैं ऋणात्मक संख्याओं के लिए -1 मिलती है: अगर 12

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100 

तो है -12

1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0011 

है और स्थानांतरण यह 31 बिट

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 

होगा जो 1 है, -1 नहीं, तो जब मैं इसे स्थानांतरित करता हूं तो मुझे -1 क्यों मिलता है?

+0

संभव डुप्लिकेट (http: // stackoverflow। कॉम/प्रश्न/141525/पूर्ण-शुरुआती-गाइड-टू-बिट-स्थानांतरण) – msw

+0

int sign_bit = (int) (संख्या> 0); – aviraldg

+5

[दो के पूरक] के लिए (http://en.wikipedia.org/wiki/Two%27s_complement#Complement_of_a_positive_number) (जो कि अधिकांश आधुनिक सिस्टम उपयोग करते हैं), आपका -12 गलत है। इसे 0100 समाप्त करना चाहिए। –

उत्तर

11

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

यदि आप रुचि रखते हैं तो साइन बिट का मूल्य है, तो बदलावों जैसे बिटटाइव ऑपरेशंस का उपयोग करने का प्रयास करने में समय बर्बाद करना बंद करें। बस अपनी संख्या 0 से तुलना करें और देखें कि यह नकारात्मक है या नहीं।

+1

यह वास्तव में पुरानी पोस्ट है लेकिन मैंने कुछ और ढूंढते समय इसे देखा। मैं आम तौर पर यहां जो कह रहा हूं उससे सहमत हूं। लेकिन कुछ धारणाएं हैं कि उन्होंने अपने प्रश्न में बनाया है कि उन्होंने अपने कोड के नतीजे में योगदान दिया होगा। बिट बिट स्थानांतरण का उपयोग करके या साइन बिट की जांच करने के लिए बस थोड़ा-मास्क का उपयोग करके इसे स्वतंत्र रूप से आर्क किया जा सकता है। –

+0

यह +0.0 से -0.0 अंतर नहीं करता है। इसके लिए आपको साइन बिट तक पहुंचने की आवश्यकता है। जॉन का जवाब देखें। –

+0

@NeilG प्रश्न में पाठ के आधार पर, ऐसा लगता है कि मुझे पूर्णांक के बारे में पूछना है। –

24

इसके बारे में क्या?

int sign = number < 0;

2

>> ऑपरेटर एक arithmetic shift, जो संख्या के हस्ताक्षर को बरकरार रखे हुए प्रदर्शन कर रहा है।

+4

नहीं। '' 'ऑपरेटर द्वारा किस प्रकार की शिफ्ट की जाती है कार्यान्वयन-परिभाषित है। किसी भी प्रकार की शिफ्ट हो सकती है। – AnT

+0

@AndreyT: मैंने कहा "' 'ऑपरेटर एक अंकगणितीय शिफ्ट कर रहा है ", और यह वही है जो इस मामले में कर रहा है, ओपी के विवरण के आधार पर। ध्यान दें कि मैंने * नहीं कहा "' 'ऑपरेटर हमेशा अंकगणित शिफ्ट करता है "या ऐसा कुछ भी। शायद मुझे और अधिक स्पष्ट होना चाहिए था, लेकिन किसी भी तरह से, मुझे नहीं लगता कि मेरा जवाब एक डाउनवोट का हकदार है। – LukeH

+2

@ डाउनवॉटर: कृपया स्वयं को औचित्य दें। मैंने समझाया * बिल्कुल * ओपी की समस्या क्या है। मैंने कोई व्यापक दावे नहीं किया जैसे "' ''ऑपरेटर हमेशा अंकगणित शिफ्ट करता है"; मैंने समझाया * बिल्कुल * इस विशेष मामले में '>>' ऑपरेटर * क्या कर रहा है *। – LukeH

7

क्योंकि आप हस्ताक्षरित पूर्णांक स्थानांतरित कर रहे हैं। अहस्ताक्षरित को पूर्णांक कास्ट:

int sign_bit = ((unsigned int)number) >> 31; 
4

पूर्णांक के लिए, परीक्षण number < 0

फ़्लोटिंग पॉइंट नंबरों के लिए, आप इस तथ्य को भी ध्यान में रखना चाहते हैं कि शून्य का संकेत है। यही है, एक -0.0 मौजूद है जो +0.0 से अलग है। दोनों को अलग करने के लिए, आप std::signbit का उपयोग करना चाहते हैं।

1
bool signbit(double x) 
{ 
    return 1.0/x != 1.0/fabs(x); 
} 

मेरा समाधान जो +/- 0 का समर्थन करता है।

2

आप cmath पुस्तकालय

#include <cmath> 

का उपयोग करें और इनपुट और आउटपुट के रूप में एक bool मूल्य के रूप में एक नाव मूल्य प्राप्त की तरह

std::cout << std::signbit(num); 

इस समारोह के लिए इसका इस्तेमाल कर सकते हैं।

true for negative 
false for positive 
उदाहरण के लिए

std :: अदालत < < std :: signbit (1);

आप एक उत्पादन 0 के रूप में (गलत) दे देंगे

लेकिन, जबकि इस समारोह का उपयोग कर आप के बारे में शून्य

std::cout << std::signbit(-0.0); // 512 (true) 
std::cout << std::signbit(+0.0); // 0 (false) 

इस लाइनों के उत्पादन में ही नहीं हैं सावधान रहना होगा।

float x = +0.01; 
std::cout << (x >= 0 ? (x == 0 ? 0 : 1) : -1); 

जो दे::

इस समस्या को आप उपयोग कर सकते हैं निकालने के लिए [? बिट स्थानांतरण करने के लिए पूर्ण प्रारंभिक मार्गदर्शिका] की

0 for 0 
1 for positive 
-1 for negative 
-1
bool signbit(double x) 
{ 
    return (__int64)x & 0x8000000000000000LL != 0LL; 
} 

bool signbit(float x) 
{ 
    return (__int32)x & 0x80000000 != 0; 
} 
+0

'__int64'' की सीमा से बाहर होने पर अपरिभाषित व्यवहार का कारण बनता है –

संबंधित मुद्दे