2010-08-03 47 views

回答

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

可以使用方法中提到here

+0

我需要交換一對像位的位置,以交換第一和第二位的位置值,同樣的位位置34,56,78,... – Muthuraman 2010-08-03 13:22:55

0

可以使用>>移位比特。

+0

是的,但是怎麼可能? – Muthuraman 2010-08-03 13:19:49

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

+1。非常簡單的代碼使用合理清晰的技術。作爲一個可移植性筆記,有些編譯器可能會使用具有足夠大範圍的int,以致該代碼將導致int被截斷。 – Brian 2010-08-03 13:38:22

+1

注意右移一個有符號的整數會傳播符號位。這意味着如果a是負數,結果的第一位將是1,而不管第二位! 我懷疑你想要unsigned int(也就是說,你對bit模式感興趣,而不是它們在2的補碼中表示的值)。如果你確實需要一個int,你可以簡單地將它強制轉換爲: ((a&0x55555555)<< 1)| ((((unsigned int)a)&0xAAAAAAAA)>> 1) 或「手動」清除它: ((a&0x55555555)<< 1)| (((a&0xAAAAAAAA)>> 1)&0x7FFFFFFF) – 2010-08-03 15:31:11

+0

還要注意,這隻會在32位int上工作。如果int是64位,那麼你把L放在最後是沒有幫助的! – 2010-08-03 15:32:09

0

如果ü希望交換奇數位置比特到偶數位置(像互換對位1 2,3 4,5 6,7 8)

無符號字符A,X,Y,Z ;
a = 2 + 4 + 8 + 128;
x = a & 170;
y = a & 85;
z =(x >> 1)|(y < < 1);

Z是答案。

同樣我們可以交換16位等等。請制定出以上示例場景......

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

其中x中的數字。