首页 > 代码库 > C语言之位运算
C语言之位运算
1.今天看到两个不错的位运算,一个是判断一个整数是否是2的n次幂,另一个是将一个非2的n次幂整数,经转变得到大于该数的2的n次幂整数。
2.判断一个整数是否是2的n次幂.
static inline intis_pow_of_2(uint32_t x) { return !(x & (x-1));}
该方法利用了若一个数x为2的n次幂(n >= 0)则一定有 x & (x - 1) = 0.
3.将一个非2的n次幂整数,经转变得到大于该数的2的n次幂整数。
static inline uint32_tnext_pow_of_2(uint32_t x) { if ( is_pow_of_2(x) ) return x; x |= x>>1; x |= x>>2; x |= x>>4; x |= x>>8; x |= x>>16; return x+1;}
若一个unint32_t类型的整数x,且x非2的n次幂(n >= 0),则经过:
x |= x>>1; x |= x>>2; x |= x>>4; x |= x>>8; x |= x>>16;
运算后便可得到 y = 2^m - 1,其中y + 1为最小的大于x的且是2的m次幂的整数.
例如: x = 3, 经过上边的运算后,便可得到 y = 2 ^ 2 - 1 = 3, y + 1 = 4;
x = 9, 经过上边的运算后,便可得到 y = 2 ^ 4 - 1 = 15, y + 1 = 16;
这样遍得到最小的大于9且是2的n次幂的整数。
C语言之位运算
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。