2012-11-21 11 views
9

में किसी व्यक्ति के पूरक करने के लिए हेक्साडेसिमल से वहाँ एक आसान तरीका अजगर में एक व्यक्ति की पूरक निर्माण करने के लिए है?अजगर

उदाहरण के लिए, यदि आप हेक्स मान 0x9E लेते हैं, तो मुझे इसे 0x61 में परिवर्तित करने की आवश्यकता है।

मैं के लिए 0 है और 0 है द्विआधारी 1 के स्वैप करने के लिए 1 के लिए की जरूरत है। ऐसा लगता है कि यह सरल होना चाहिए।

उत्तर

23

बस 0xFF के खिलाफ the XOR operator ^ का उपयोग करें:

>>> hex(0x9E^0xFF) 
'0x61' 

आप एक बाइट से भी बड़ा मूल्यों के साथ काम करने की जरूरत है, तो आप अपने मूल्य पर int.bit_length() method से मुखौटा बना सकते हैं:

>>> value = 0x9E 
>>> mask = (1 << value.bit_length()) - 1 
>>> hex(value^mask) 
'0x61' 
>>> value = 0x9E9E 
>>> mask = (1 << value.bit_length()) - 1 
>>> hex(value^mask) 
'0x6161' 
+0

ठीक है मैं उलझन में हूं, '~ x' गलत क्यों है? यह सब के बाद बाइनरी अस्वीकरण ऑपरेटर माना जाता है। बाइनरी ऑप्स का संबंध होने पर मैं हस्ताक्षर/हस्ताक्षरित भेद की कमी पर अपने दिमाग को लपेट नहीं सकता – Kos

+1

@ कोस: '~' सचमुच '- (x + 1)' लौटाता है, जो हस्ताक्षरित मूल्यों से निपटने के दौरान बहुत अच्छा है। तो '~ 0x9E'' -15 9', या '-0x9f' हेक्स है। हस्ताक्षर किए गए बिटवाइज काम के लिए, इतना अच्छा नहीं .. –

+0

ठीक है मुझे यह मिला है, पायथन की "नकारात्मक संख्याओं के सामने '1' की अवधारणात्मक अनंत स्ट्रिंग" दृष्टिकोण मेरे सिर से गड़बड़ हो गई है। सी बिटवाइज़ ऑप्स के लिए उपमा यहाँ काम नहीं करेगा :( – Kos

1

हा। बस पता चला कि अजगर bin() एक स्ट्रिंग वापस!

तो हम इस पर कुछ मजा कर सकते हैं!

for x in numbers: # numbers is a list of int 
    b = bin(x) 
    #print b # e.g. String 0b1011100101 
    b = b.replace('0', 'x') 
    b = b.replace('1', '0') 
    b = b.replace('x', '1') 
    b = b.replace('1b', '0b') 
    #print b # String 0b0100011010 
    print int(b, 2) # the decimal representation