2010-08-03 4 views

Répondre

1
unsigned char swapped = ((original & 85) << 1) | ((original & 170) >> 1); 
0

Vous pouvez utiliser la méthode mentionnée here

+0

J'ai besoin d'échanger des paires de positions de bits comme la paire pour échanger des valeurs de position de 1er et 2ème bit de manière similaire positions de bits 34, 56, 78, ... – Muthuraman

0

Vous pouvez utiliser le >> pour déplacer les bits.

+0

oui, mais comment? – Muthuraman

8
int pairwise_bit_swap(int a) { 
    return ((a & 0x55555555L) << 1) | ((a & 0xAAAAAAAAL) >> 1); 
} 
+0

+1. Code très simple utilisant une technique raisonnablement claire. En tant que note de portabilité, il est possible que certains compilateurs utilisent un int avec une portée suffisamment grande pour que ce code provoque la tronque de l'int. – Brian

+1

Attention, le décalage d'un entier signé propagera le bit de signe. Cela signifie que si a est négatif, le premier bit du résultat sera 1, quel que soit le second! Je suppose que vous voulez un entier non signé (c'est-à-dire que vous êtes intéressé par le modèle de bits, pas par la valeur qu'ils représentent dans le complément de 2). Si vous avez vraiment, vraiment besoin d'être un int, vous pouvez simplement le lancer à la volée: ((a & 0x55555555) << 1) | ((((unsigned int) a) & 0xAAAAAAAA) >> 1) ou effacer "manuellement": ((a & 0x55555555) << 1) | (((a & 0xAAAAAAAA) >> 1) & 0x7FFFFFFF) –

+0

Notez également que cela ne fonctionnera que sur un int 32 bits. Le fait que vous mettiez L à la fin n'est d'aucune aide si int est 64 bits! –

0

Si u veulent échanger des bits de position impaire à la position même (comme des morceaux de paires de swap 1 2, 3 4, 5 6 et 7 8)

un unsigned char, x, y, z ;
a = 2 + 4 + 8 + 128;
x = a & 170;
y = a & 85;
z = (x >> 1) | (y < < 1);

Z est la réponse.

De même, nous pouvons échanger 16 bits et ainsi de suite. S'il vous plaît, élaborez le scénario d'échantillon ci-dessus ...

0
((x << 1) & 0xAAAAAAAA) |((x >>1) & 0x55555555) 

où x dans le nombre.

Questions connexes