对数相关的辅助方法,Math通过软件方法实现,CircuitMath通过硬件方法实现。
参考链接:
1. Math
1) log2Up
同log2Ceil,建议使用log2Ceil。
2) log2Ceil
求对数,向上取整。
一方面:
1位二进制无符号数,表示的数值范围:0, 1
2位二进制无符号数,增加的数值范围:2, 3
3位二进制无符号数,增加的数值范围:4, 5, 6, 7, 即:2^(3-1) .. 2^3 - 1
...
n位二进制无符号数,增加的数值范围:2^(n-1) .. 2^n - 1
即是bitLength每增加1,增加的数值范围;
另一方面:
若log2(N)向上取整为n,则N的数值范围为:2^(n-1) + 1 .. 2^n;
则N-1的数值范围为:2^(n-1) .. 2^n - 1,这正是n位二进制无符号数所增加的数值范围;
所以:
(N-1).bitLength = n;
仅供理解,并非严谨证明。姑妄观之。
3) log2Down
同log2Floor,建议使用log2Floor。
4) log2Floor
求2的对数,向下取整。
基于log2Ceil,把向上取整加的1减掉。如果没有加1,也就不需要减了。
5) isPow2
判断一个数字是否2的指数幂。
2. CircuitMath
生成一个计算某个数的2的对数值的电路。小数部分舍弃掉。
1) Log2
使用分治策略,若高位的一半有比特置1,则使用高位的一半进行后续计算。
3. 附录