首页 > 编程语言 > 详细

C语言之位运算

时间:2016-10-08 07:37:30      阅读:254      评论:0      收藏:0      [点我收藏+]

1.今天看到两个不错的位运算,一个是判断一个整数是否是2的n次幂,另一个是将一个非2的n次幂整数,经转变得到大于该数的2的n次幂整数。

2.判断一个整数是否是2的n次幂.

static inline int
is_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_t
next_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语言之位运算

原文:http://www.cnblogs.com/newbeeyu/p/5937262.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!