2010-04-12 6 views
7

दो पूर्णांक एक्स और वाई को देखते हुए, मैं पी से पी + एन पर बिट्स को ओवरराइट करना चाहता हूं।एक सामान्य तरीके से बिट्स की एक श्रृंखला को ओवरराइट करना

उदाहरण:

int x  = 0xAAAA; // 0b1010101010101010 
int y  = 0x0C30; // 0b0000110000110000 
int result = 0xAC3A; // 0b1010110000111010 

इस प्रक्रिया एक नाम है?

अगर मैं मास्क है, आपरेशन आसान पर्याप्त है:

int mask_x = 0xF00F; // 0b1111000000001111 
int mask_y = 0x0FF0; // 0b0000111111110000 
int result = (x & mask_x) | (y & mask_y); 

क्या मैं काफी समझ नहीं कैसे इस तरह के निम्नलिखित सामान्य सी ++ समारोह में के रूप में एक सामान्य तरीके से यह लिखने के लिए, यह है:

template<typename IntType> 
IntType OverwriteBits(IntType dst, IntType src, int pos, int len) { 
// If: 
// dst = 0xAAAA; // 0b1010101010101010 
// src = 0x0C30; // 0b0000110000110000 
// pos = 4      ^
// len = 8    ^------- 
// Then: 
// result = 0xAC3A; // 0b1010110000111010 
} 

समस्या यह है कि मैं यह नहीं समझ सकता कि मास्क को सही तरीके से कैसे बनाया जाए, जब पूर्णांक की चौड़ाई समेत सभी चर, परिवर्तनीय हैं।

क्या कोई जानता है कि उपरोक्त फ़ंक्शन को सही तरीके से कैसे लिखना है?

उत्तर

8

थोड़ा सा काम करना चाहिए स्थानांतरण आपको आवश्यक मास्क देगा।

template<typename IntType> 
IntType OverwriteBits(IntType dst, IntType src, int pos, int len) { 
    IntType mask = (((IntType)1 << len) - 1) << pos; 
    return (dst & ~mask) | (src & mask); 
} 
+1

क्या आपको एक विशेष मामले की आवश्यकता है जब आप पूरे स्ट्रिंग को मास्क कर रहे हों? जैसा कि उस मामले में 1 << लेन अधिक बह जाएगा। –

+0

यह वास्तव में बह जाएगा, लेकिन यह अभी भी सही जवाब देगा। –

0

आप का उपयोग मास्क बना सकते हैं:

int mask_y = ((1 << len) - 1) << pos; 
int mask_x = ~mask_y; 
+2

यह अगर 'IntType' एक' लंबे long' है (सबसे सिस्टम पर) काम नहीं करेगा। –

0

((2^N + 1) - 1) लेने के द्वारा पी + N करने के लिए पदों पी के लिए मुखौटा बनाओ < < पी ??

2^(N + 1) आप स्थिति में एक 1 एन 1, सभी पहले एन बिट्स Suntracting 1 सेट देता है, और उसके बाद पी बार स्थानांतरण पूरी व्यवस्था पी पदों चाल छोड़ दिया ...

के बाद से 2^N 1 बाईं पारी एन बार करने के लिए बराबर है, पूरी बात द्वारा किया जाता है:

((1 << (N+1)) -1) << P 

एन और पी-एक करके बंद हो सकता है, लेकिन आम तौर पर, इस

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