मुझे अतीत में कई बार ऐसा करना पड़ा, और मैं कभी भी परिणामों से संतुष्ट नहीं हुआ।असाइन किए गए बिट सरणी की प्रतिलिपि बनाने के लिए एक समय कुशल एल्गोरिदम क्या है?
क्या कोई भी स्रोत से गंतव्य तक एक संगत बिट सरणी की प्रतिलिपि बनाने का एक तेज़ तरीका सुझा सकता है, जहां सुविधाजनक प्रोसेसर सीमाओं पर स्रोत और गंतव्य दोनों को गठबंधन नहीं किया जा सकता है (दाएं स्थानांतरित)?
यदि स्रोत और गंतव्य दोनों को गठबंधन नहीं किया गया है, तो समस्या को जल्दी से बदला जा सकता है जहां उनमें से केवल एक को गठबंधन नहीं किया जाता है (पहली प्रतिलिपि के बाद)।
एक प्रारंभिक बिंदु के रूप में, मेरी कोड अनिवार्य रूप से (यह सिर्फ एक कफ उदाहरण बंद है अपरीक्षित, उपेक्षा साइड इफेक्ट) निम्नलिखित की तरह कुछ के लिए देख समाप्त होता है:
const char mask[8] = { 1, 3, 7, 15, 31, 63, 127, 255 };
/* Assume:
* - destination is already zeroed,
* - offsets are right shifts
* - bits to copy is big (> 32 say)
*/
int bitarray_copy(char * src, int src_bit_offset, int src_bit_len,
char * dst, int dst_bit_offset) {
if (src_bit_offset == dst_bit_offset) { /* Not very interesting */
} else {
int bit_diff_offset = src_bit_offset - dst_bit_offset; /* assume positive */
int loop_count;
char c;
char mask_val = mask[bit_diff_offset];
/* Get started, line up the destination. */
c = (*src++ << bit_diff_offset) | ((*src >> (8 - bit_diff_offset)) & mask_val);
c &= mask[8-dst_bit_offset];
*dst++ |= c;
src_bit_len -= 8 - dst_bit_offset;
loop_count = src_bit_len >> 3;
while (--loop_count >= 0)
* dst ++ = (*src++ << bit_diff_offset) | ((*src >> (8 - bit_diff_offset)) & mask_val);
/* Trailing tail copy etc ... */
if (src_bit_len % 8) /* ... */
}
}
(वास्तव में इस से बेहतर मैं है पहले किया है। यह बहुत बुरा नहीं लग रहा है)
बिट फ़ील्ड के साथ 'स्ट्रक्चर' का उपयोग करें और शिकायतकर्ता को ऐसा करने दें? : पी –
* यह * चीजों में सुधार कैसे करेगा? – Jamie
क्या इन बिट फ़ील्ड ओवरलैप करते हैं? क्या आप समस्या को उस समस्या में बदल सकते हैं जिसे आसानी से memcpy लागू करके हल किया जा सकता है? विजुअल सी ++ पर memcpy अत्यधिक अनुकूलित (/ ARCH: SSE2) है, और जीसीसी और दोस्तों कम से कम सुनिश्चित करते हैं कि वे बड़े हिस्से की प्रतिलिपि बनाने से पहले अनुच्छेद सीमा तक पहुंच गए हैं। –