位運算小技巧總結(更新中)

想到哪寫到哪

交換兩個數字

void swap(int & a, int & b){
    a ^= b;
    b ^= a;
    a ^= b;
}

判斷奇偶

if(1 == (n & 1))    // 奇數
if(0 == (n & 1))    // 偶數

 

乘以二和除以二

n << 1 // 乘以二
n >> 1 // 除以二
n << x // 乘以二的x次方
n >> x // 除以二的x次方
n << 1 | 1 // 乘以二然後加一

 求最低位的1

#define lowbit(x) (x)&(-(x))

位運算實現加法

int add(int a, int b) {
	if (0 == b) {
		return a;
	}
	return add(a ^ b, (a & b) << 1);
}

位運算實現減法(從計算機組成原理裏面學到的)

int sub(int a, int b) {
	return add(a, ~b + 1);
}

位運算實現乘法(快速冪的一個模板)

unsigned int mult(int a, int b) {
	unsigned int ans = 0;
	while (b) {
		if (1 == (b & 1)) {
			ans += a;
		}
		a = a << 1;
		b = b >> 1;
	}
	return ans;
}

交換數字的二進制中相鄰的奇數位和偶數位

int exchange(int n) {
	return ((n & 0xaaaaaaaa) >> 1) + ((n & 0x55555555) << 1);
}

找到該數字的二進制中有多少個1

int calc(int n) {
	int count = 0;
	while (n) {
		n = n & (n - 1);
		count++;
	}
	return count;
}

 

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