2010-04-12 6 views
7

İki tam sayı X ve Y verildiğinde, P konumundan P + N konumuna bitlerin üzerine yazmak istiyorum.Genel bir yolla bir tamsayıda bitlerin üzerine yazmak

Örnek:

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

bu prosedür bir adı var mı? Maske varsa

, operasyon kolay yeterlidir:

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

Oldukça anlamaya, aşağıdaki jenerik C++ fonksiyonunda olduğu gibi, genel bir şekilde yazmaya nasıl edemez Ne:

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 
} 

sorun tamsayı genişliğine dahil tüm değişkenler, değişken olduğunda düzgün maskeleri nasıl bilemiyorum olmasıdır.

Yukarıdaki işlevi nasıl yazacağını bilen var mı?

cevap

8

çalışmalıdır vardiya ihtiyacınız olan maskeleri size verecektir.

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

Bu, dizenin tamamını maskelediğinizde özel bir durum mu gerektiriyor? Bu durumda olduğu gibi 1 << len taşacak. –

+0

Gerçekten de taşacak, ancak yine de doğru cevabı verecektir. –

0

kullanarak maskeleri oluşturabilirsiniz:

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

'IntType' bir' uzun long' (çoğu sistemlerde) ise bu işe yaramaz. –

0

((2^N + 1) - 1) alarak P + N pozisyonları P maske yapın < < P ??

2^

yana ... (N + 1) verir 1 setleri tüm birinci N bit Suntracting bir pozisyonda içinde 1 N + 1, ve o zaman P kez değişen bütün düzenleme p pozisyonları hareket sol 2 N1 sol kaydırma K kez equivilent olan ^, her şey yapılır:

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

N ve P tarafından kapalı olabilir, fakat genel olarak bu biraz