这个 nextPowerOfTwo() 函数的数学原理是啥

实际上,它的目的是要把``v - 1``的最高位为1的位开始,把它及最低位之间的所有位全都变成1。直接看例子吧。比如一个数5 (101)v = 0b101;v --; // v = 0b0000 0100;v |= v \u0026gt;\u0026gt; 1; // v = 0b0000 0110;v |= v \u0026gt;\u0026gt; 2; // v = 0b0000 0111;// ... 下面的就不用写了v ++; // v = 0b0000 1000 就是要的答案从上面的例子就可以看出这个算法的目的,就是要不断的复制已经置为1的最高位。因为第一次右移1位,就把最高位复制了1次;然后第二次就要复制最高的2个位,所以右移2位;下一次就要复制4个位,所以右移4位。如此类推。因为uint是32位,所以只要最后做到16就可以了。为什么要先把``v``减1?如果``v``本身已经是答案的话,运行此算法就会得到``v * 2``,所以先减1。如果``v``是0,那么它减1就是-1,或者说是UINT_MAX,是全1的一个数,最后执行完的结果还是0。


    推荐阅读