2010-03-05 3 views
5

के लिए एल्गोरिदम यदि मेरे पास 32-बिट बाइनरी नंबर है और मैं 16-बिट संख्या के बाइनरी नंबर के निचले 16-बिट को प्रतिस्थापित करना चाहता हूं जो मेरे पास है और उस संख्या के ऊपरी 16-बिट को रखें एक नया द्विआधारी संख्या उत्पन्न करें .. मैं सरल बिटवाई ऑपरेटर का उपयोग करके यह कैसे कर सकता हूं?बिटवाईड फिडलिंग

उदाहरण के लिए 32-बिट द्विआधारी संख्या है:

1010 0000 1011 1111 0100 1000 1010 1001 

और कम 16 बिट मेरे पास है:

    0000 0000 0000 0001 

तो परिणाम है:

1010 0000 1011 1111 0000 0000 0000 0001 

मैं यह कैसे कर सकता हूँ?

+0

मैं एक ही चरण – aherlambang

+0

आप 1 ऑपरेटर के साथ ऐसा नहीं कर सकते में ऐसा करना चाहते हैं के साथ 16 बिट मूल्य विलय करने के लिए। आपको कम से कम 2 की आवश्यकता है, और साइन एक्सटेंशन शामिल है, 3. – polygenelubricants

उत्तर

8

आप दो चरणों में ऐसा करते हैं:

  • (0 के साथ और यह) प्रतिस्थापन में (यह नया बिट्स के साथ या) बाहर मास्क बिट्स कि आप बदलना चाहते
  • भरण
अपने मामले में

तो,

i32 number; 
i32 mask_lower_16 = FFFF0000; 
i16 newValue; 

number = (number AND mask_lower_16) OR newValue; 

वास्तविक प्रोग्रामिंग भाषा कार्यान्वयन में, आप भी आवश्यकता हो सकती है 16-बिट मान पर साइन एक्सटेंशन के मुद्दे को हल करने के लिए। जावा में, उदाहरण के लिए, आप short इस तरह के ऊपरी 16 बिट मुखौटा करने के लिए है:

short v = (short) 0xF00D; 
    int number = 0x12345678; 
    number = (number & 0xFFFF0000) | (v & 0x0000FFFF); 
    System.out.println(Integer.toHexString(number)); // "1234f00d" 
+3

+1। अच्छी तरह से समझाया। –

+1

यदि ओपी एक नौसिखिया है, तो कृपया तार्किक और (&&) और bitwise और (&) –

+0

के बीच का अंतर ध्यान दें। साइन एक्सटेंशन मुद्दे को भी संबोधित किया। – polygenelubricants

3
(original32BitNumber & 0xFFFF0000) | 16bitNumber 
+1

दूसरा ऑपरेशन होना चाहिए या – vpram86

+0

धन्यवाद! मैंने यह लाखों बार किया होगा और अभी भी गलत चीज़ टाइप करने में कामयाब रहेगा! –

+0

+1 यह है !! –

1

ठीक है, मैं आपको जवाब बता सकते हैं। लेकिन शायद यह होमवर्क है। तो मैं नहीं करूँगा।

पर विचार करें आप कुछ ही विकल्प हैं कि:

| // bitwise OR 
^ // bitwise XOR 
& // bitwise AND 

हो सकता है कि एक छोटे से टेबल को आकर्षित और तय करते हैं जो एक आप सही परिणाम दे देंगे (जब आप अपने बड़े द्विआधारी संख्या का सही अनुभाग पर कार्य करते हैं)।

1

कम बिट्स को मास्क करने के लिए & का उपयोग करें। 32 बिट मूल्य

uint a = 0xa0bf68a9 
short b = 1 

uint result = (a & 0xFFFF0000) | b;