2010-12-14 16 views
13

कहें कि मेरे पास इस 1010XXXX की तरह एक बाइट है जहां एक्स मान कुछ भी हो सकता है। मैं ऊपरी चार बिट्स को एक विशिष्ट पैटर्न में सेट करना चाहता हूं, 1100 कहें, ऊपरी चार बिट्स को अप्रभावित छोड़कर। मैं सी में सबसे तेज़ कैसे करूँगा?आप बाकी को प्रभावित किए बिना सी में केवल बाइट के कुछ निश्चित बिट्स कैसे सेट करते हैं?

उत्तर

11

आप उन सभी बिट्स को 0 से थोड़ा सा सेट कर सकते हैं- 4 बिट्स 0 पर सेट किए गए हैं और अन्य सभी सेट 1 तक (यह 4 बिट्स सेट 1 के पूरक है)। फिर आप सामान्य रूप से बिट्स-या बिट्स में कर सकते हैं।

val &= ~0xf; // Clear lower 4 bits. Note: ~0xf == 0xfffffff0 
val |= lower4Bits & 0xf; // Worth anding with the 4 bits set to 1 to make sure no 
          // other bits are set. 
33

यानी सामान्य में:

value = (value & ~mask) | (newvalue & mask); 

mask परिवर्तित करने की (और उन्हें केवल) की स्थापना की 1 के लिए सभी बिट्स के साथ एक मूल्य है - यह आपके मामले में 0xf किया जाएगा। newvalue एक मूल्य है जिसमें उन बिट्स की नई स्थिति शामिल है - अन्य सभी बिट्स को अनिवार्य रूप से अनदेखा किया जाता है।

यह उन सभी प्रकार के लिए काम करेगा जिनके लिए बिटवाई ऑपरेटरों का समर्थन किया जाता है।

+0

क्या आप कृपया एक विशिष्ट उदाहरण दे सकते हैं? मान लीजिए मेरे पास है: n = 1024. मैं बिट्स को स्थिति 3 से 7 (समावेशी, कम से कम महत्वपूर्ण बिट से 0 से शुरू करना) से बदलना चाहता हूं। परिणाम: 1176. मैं इसे कैसे प्राप्त कर सकता हूं? धन्यवाद। – dh16

0

बिटवाई ऑपरेटर का उपयोग करें या | आप जब आप 0

1 से एक बाइट की बिट को बदलने के लिए उदाहरण

#include <stdio.h> 

int byte; 
int chb; 

int main() { 
// Change bit 2 of byte from 0 to 1 
byte = 0b10101010;  
chb = 0b00000100;  //0 to 1 changer byte 
printf("%d\n",byte); // display current status of byte 

byte = byte | chb;  // perform 0 to 1 single bit changing operation 
printf("%d\n",byte); 

// Change bit 2 of byte back from 1 to 0 
chb = 0b11111011;  //1 to 0 changer byte 

byte = byte & chb;  // perform 1 to 0 single bit changing operation 
printf("%d\n",byte); 
} 

चाहते 0 से करने के लिए 1.

उपयोग बिटवाइज़ ऑपरेटर और & एक बाइट का सा बदलना चाहते हैं जब शायद बेहतर तरीके हैं, मुझे नहीं पता। इससे आपको अभी मदद मिलेगी।

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

  • कोई संबंधित समस्या नहीं^_^