这篇文章转自http://graphics.stanford.edu/~seander/bithacks.html,作者收集了一系列巧妙的bit运算技巧,并亲自验证通过,转载于此并做了部分精简
·获得整数的符号
int v; // 我们想获得v的符号,并把结果放入sign中
int sign;
//CHAR_BIT是一个字节的bit数,在IA32架构中是8
// if v < 0 then -1, else 0.
sign = –(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT – 1));
// if v < 0 then -1, else +1
sign = +1 | (v >> (sizeof(int) * CHAR_BIT – 1));
// -1, 0, or +1
sign = (v != 0) | –(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT – 1));
// if v < 0 then 0, else 1
sign = 1 ^ ((unsigned int)v >> (sizeof(int) * CHAR_BIT – 1));
·不用分支计算绝对值(abs)
int v; // 需要计算绝对值的变量
unsigned int r; // 结果
int const mask = v >> (sizeof(int) * CHAR_BIT – 1);
r = (v + mask) ^ mask;
r = (v ^ mask) – mask; //这两个版本效果是等同的
·不用分支计算最大或者最小值
int x,y; // 我们需要计算的变量
int r; // 结果
r = y ^ ((x ^ y) & –(x < y)); // min(x, y)
r = x ^ ((x ^ y) & –(x < y)); // max(x, y)
//如果你确保 INT_MIN <= x-y <= INT_MAX,那么可以用下面的方法,速度更快
r = y + ((x – y) & ((x – y) >> (sizeof(int) * CHAR_BIT – 1))); // min(x, y)
r = x – ((x – y) & ((x – y) >> (sizeof(int) * CHAR_BIT – 1))); // max(x, y)
·判断是否是2的幂方
unsigned int v; // 我们要检测的数据
bool f; // 结果
f = ((v & (v – 1)) == 0);
//需要注意的是,上面的方法对于0得到的结果是错误的,0不应该时为2的幂方,修正后的算法如下
f = v && !(v & (v – 1));
Continue reading “Bit运算技巧汇集(上)” →