参考资料
思路
设 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;
}