2010-08-25 21 views
1

Disons que j'ai ces deux chiffres:les bits Permutation à un point donné entre deux octets

x = 0xB7 
y = 0xD9 

Leurs représentations binaires sont:

x = 1011 0111 
y = 1101 1001 

Maintenant, je veux Répartiteur (GA) à une donnée point, disons à partir de la position 4.

Le résultat attendu devrait être:

x = 1011 1001 
y = 1101 0111 

Bitwise, comment puis-je y parvenir?

Répondre

1

Je voudrais simplement utiliser les opérateurs au niveau du bit:

t = (x & 0x0f) 
x = (x & 0xf0) | (y & 0x0f) 
y = (y & 0xf0) | t 

qui travaillerait pour ce cas précis. Afin de le rendre plus adaptable, je l'ai mis dans une fonction, quelque chose comme:

def swapBits (x, y, s, e): 
    lookup = [255,127,63,31,15,7,3,1] 
    mask = lookup[s] & !lookup[e] 
    t = x & mask 
    x = (x & !mask) | (y & mask) 
    y = (y & !mask) | t 
    return (x,y) 

Les valeurs de recherche vous permettent de spécifier quels bits d'échanger. Prenons les valeurs xxxxxxxx pour x et yyyyyyyy pour y avec le bit de départ s de 2 et le bit de fin e de 6 (les bits commencent à zéro à gauche dans ce scénario).

x  y  s e t  mask  !mask execute 
-------- -------- - - -------- -------- -------- ------- 
xxxxxxxx yyyyyyyy 2 6     starting point 
           00111111 mask = lookup[2](00111111) 
           00111100  & !lookup[6](11111100) 
         00xxxx00   t = x & mask 
xx0000xx        x = x & !mask(11000011) 
xxyyyyxx         | y & mask(00111100) 
     yy0000yy      y = y & !mask(11000011) 
     yyxxxxyy       | t(00xxxx00) 
0

Swapping individual bits with XOR

unsigned int i, j; // positions of bit sequences to swap 
unsigned int n; // number of consecutive bits in each sequence 
unsigned int b; // bits to swap reside in b 
unsigned int r; // bit-swapped result goes here 

unsigned int x = ((b >> i)^(b >> j)) & ((1U << n) - 1); // XOR temporary 
r = b^((x << i) | (x << j));