zoukankan      html  css  js  c++  java
  • C语言之位运算

    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次幂的整数。

    -------------------------------------------------------------------------------------------

    补充1 判断某个数的第n位是否被设置为1

    template <typename T>
    bool GetBitFlag(const T &val, int32_t idx)
    {
        int nbytes = idx / 8;
        int nbit = idx % 8;
    
        if(nbytes >= sizeof(T))
        {
            return false;
        }
    
        const char *c = ((char *)&val) + nbytes;
    
        return (*c & (1 << nbit)) > 0;
    }

     补充2: 求按照 n (2 的 幂)个字节对其后的地址:

    #define ngx_align_ptr(p, a)                                                  
        (u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))

    就是 nginx 中的代码 先加上 n - 1 之后,再舍弃 n - 1 的值 保证后 (n - 1) 对应的位 为 0

  • 相关阅读:
    将字符串数组转换成整形数组
    层的三级联动
    sql
    工作中的感悟
    asp.net如何抓取其他网站的内容
    看不到的SQl
    对数据库中时间为空的处理和数据转换成百分数
    不带查询条件的分页
    svn中出现红色感叹号
    视图的创建(根据已有的表)
  • 原文地址:https://www.cnblogs.com/newbeeyu/p/5937262.html
Copyright © 2011-2022 走看看