位操作总结

    博客分类: 笔记 阅读次数:

位操作总结

基础操作

置位、取位

// 设置第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}$