求m的最近较大的2次幂n的2^n值(n=NextPow2(m)).md

参考资料

思路

设 m = 13, 表示成二进制则为:m = 1101
考虑到 2^n 一定是最高位为1,其余位均为0,也就是 2^n = 100…
那么大于m的最小2^n一定是m的二进制最高位左移一位,其余位为0即可

源码

android/external/skia/src/core/SkMathPriv.h:

/**
 * Returns the next power of 2 >= n or n if the next power of 2 can't be represented by size_t.
 */
static inline size_t GrNextSizePow2(size_t n) { // 如果 n = 13
    constexpr int kNumSizeTBits = 8 * sizeof(size_t); // kNumSizeTBits = 8 * 4(假设编译为32位) = 32
    constexpr size_t kHighBitSet = size_t(1) << (kNumSizeTBits - 1); // kHighBitSet = 1 << 31

    if (!n) { // 边界判断 n = 0 时,返回 1
        return 1;
    } else if (n >= kHighBitSet) { // n的最近较大2次幂值溢出
        return n;
    }

    n--; // n = 12,为什么要减1?考虑n为2的整数次幂的情况!
    uint32_t shift = 1;
    while (shift < kNumSizeTBits) { // 确保每一位都置为1
        n |= n >> shift; // n = 12 | 12 >> 1 = 1100 | 110 = 1110
        shift <<= 1; // shift = 2
    }
    // 此时 n = 1111 = 15
    return n + 1;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值