Bit operations algorithms
This article is from http://bits.stephan-brumme.com/
Many thanks to STEPHAN BRUMME
Round up to the next power of two
将一个数向上对齐到2的幂
例如
3 对齐后为 $2^2$ = 4 5 对齐后为 $2^3$ = 8 10 对齐后为 $2^4$ = 16
I get the code from the pipe project of Clark Gaebel cg.wowus.cg@gmail.com Thanks to Clark Gaebel
size_t next_pow2(size_t n) { assert(n != 0); size_t top = (~(size_t)0 >> 1) + 1; if (n >= top) return n; n--; for(size_t shift = 1; shift < (sizeof n)*8; shift <<= 1) n |= n >> shift; n++; return n; }
top表示size_t能表示的2的幂的最大值
算法原理
除0之外的每一个数, 用二进制表示,至少有一个bit是1, 假设对于n, 只考虑为1的最高bit位, 如果将它右边的所有比特设为1, 那么得到的结果加1就是下一个2的幂。 步骤1: 00...001... -> 00...001111 步骤2:加1 -> 00...010000 实现步骤1的方式: n |= n >> 1 n |= n >> 2 n |= n >> 4 ... 考虑到n本来就已经是2的幂的情况,所以需要先将n减1之后再移位。
Is power of two
判断一个数是否是2的幂
bool isPowerOfTwo(unsigned int x) { return ((x & (x - 1)) == 0); }
算法原理
2的幂的特征: 二进制表示中只有一个1, 1右边全部为0, 所以x如果为2的幂, 那么x & (x -1) 一定为0
Wap two number
void swapXor(int *a, int *b) {
- a ^= *b;
- b ^= *a;
- a ^= *b;
}
算法原理:
使用异或的方式,不使用中间变量,交换两个数的值。 0 XOR 0 -> 0 0 XOR 1 -> 1 1 XOR 0 -> 1 1 XOR 1 -> 0 相同的bit进行异或,结果为0, 与零异或,结果保持不变 a_new = a XOR b b_swapped = b XOR a_new = b XOR (a XOR b) = a XOR (b XOR b) = a a_swapped = a_new XOR b_swapped = (a XOR b) XOR a = b