& 0x55555555等 與移位

0xaaaaaaaa = 10101010101010101010101010101010 (偶數位爲1,奇數位爲0)
0x55555555 = 1010101010101010101010101010101 (偶數位爲0,奇數位爲1)
0x33333333 = 110011001100110011001100110011 (1和0每隔兩位交替出現)
0xcccccccc = 11001100110011001100110011001100(0和1每隔兩位交替出現)
0x0f0f0f0f = 00001111000011110000111100001111 (1和0每隔四位交替出現)
0xf0f0f0f0 = 11110000111100001111000011110000 (0和1每隔四位交替出現)

(num & 0x55555555) << 1)

((x & 0x55555555) << 1 --- 奇數位移到偶數位
((x >> 1) & 0x55555555); --- 先右移一位,等於拿到奇數位

 

例題:配對交換。編寫程序,交換某個整數的奇數位和偶數位,儘量使用較少的指令(也就是說,位0與位1交換,位2與位3交換,以此類推)。

class Solution {
public:
	int exchangeBits(int num) {
		return ((num & 0x55555555) << 1) | ((num & 0xaaaaaaaa) >> 1);
	}
};

將(x&(0x55555555))<<1; x按位與0x55555555後得到的二進制奇數位與x相同但偶數位均爲0,然後再向左移一位,變成偶數位爲原來的奇數位,且移動後奇數位全爲0;
將(x&(0xAAAAAAAA))>>1; x按位與0xAAAAAAAA後得到的二進制偶數位與x相同但奇數位均爲0,然後再向右移一位,變成奇數位爲原來的偶數位,且移動後偶數位全爲0;
最後將兩個二進制按位或((x&(0x55555555))<<1) | ((x&(0xAAAAAAAA))>>1),便最終得到了交換後的數。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章