应用实例
很棒的应用实例,你可以mark一下,方便以后对照使用。 1、混合体
位运算实例
位运算 功能 示例 x >> 1 去掉最后一位 101101->10110 x << 1 在最后加一个0 101101->1011010 x << 1 | 1 在最后加一个1 101101->1011011 x | 1 把最后一位变成1 101100->101101 x & -2 把最后一位变成0 101101->101100 x ^ 1 最后一位取反 101101->101100 x | (1 << (k-1)) 把右数第k位变成1 101001->101101,k=3 x & ~ (1 << (k-1)) 把右数第k位变成0 101101->101001,k=3 x ^(1 <<(k-1)) 右数第k位取反 101001->101101,k=3 x & 7 取末三位 1101101->101 x & (1 << k-1) 取末k位 1101101->1101,k=5 x >> (k-1) & 1 取右数第k位 1101101->1,k=4 x | ((1 << k)-1) 把末k位变成1 101001->101111,k=4 x ^ (1 << k-1) 末k位取反 101001->100110,k=4 x & (x+1) 把右边连续的1变成0 100101111->100100000 x | (x+1) 把右起第一个0变成1 100101111->100111111 x | (x-1) 把右边连续的0变成1 11011000->11011111 (x ^ (x+1)) >> 1 取右边连续的1 100101111->1111 x & -x 去掉右起第一个1的左边 100101000->1000 x&0x7F 取末7位 100101000->101000 x& ~0x7F 是否小于127 001111111 & ~0x7F->0 x & 1 判断奇偶 00000111&1->1 2、交换两数
int swap(int a, int b)
{
if (a != b)
{
a ^= b;
b ^= a;
a ^= b;
}
}
3、求绝对值
int abs(int a)
{
int i = a >> 31;
return ((a ^ i) - i);
}
4、二分查找32位整数前导0个数
int nlz(unsigned x)
{
int n;
if (x == 0) return(32);
n = 1;
if ((x >> 16) == 0) {n = n +16; x = x <<16;}
if ((x >> 24) == 0) {n = n + 8; x = x << 8;}
if ((x >> 28) == 0) {n = n + 4; x = x << 4;}
if ((x >> 30) == 0) {n = n + 2; x = x << 2;}
n = n - (x >> 31);
return n;
}