基础操作
置位、取位
// 设置第12位为1,而保证其它的位不变
result |= (1<<12);
// 设置第12位为0,而保证其它的位不变
result &= ~(1<<12);
// 取最低2位
result = exp & 3;
// 将第12位取反,而保证其它的位不变
result ^= (1<<12);
// 将自己清0
result ^= reslut;
异或还有个性质:与0异或仍为自身
// 最右边的1变成0
x &= (x-1);
// 返回最低位的1及其后的0构成的数
result = x & (-x);
// 返回最高位的1及其后的0构成的数
int highbit(unsigned x) // 假定位32位
{
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return (x >> 1) + 1;
}
highbit()说明:假定x左起第k位是1,那么
x |= x >> 1
之后,其第k位,第k+1位都是1,继续下去,最后x第k位及其右边所有位都是1.
判断数的性质
// 判断是否是奇数
(n & 1) == 1
// 检测一个无符号数是不为2的次方
(x & (x-1) == 0) ? true : false;
函数
计算绝对值
int abs(int x)
{
int y;
y = x >> 31;
return (x^y)-y; // or:(x+y)^y
}
交换两数
x = x ^ y
y = x ^ y
x = x ^ y
求幂函数
// 计算 m 的 n 次方
int pow(int m, int n)
{
int base = m;
int ret = 1;
while(n != 0){
if (n & 1){
ret *= base;
}
base *= base;
n = n >> 1;
}
return ret;
}
说明:假设
n=13
, 那么其二进制表示为1101
,$m^{13} = m^{0001} * m^{0100} * m^{1000}$
本文由 晓楼 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前注明出处