平时对于以2的多少次方求解相当方便但是以2为底的对数计算用算法实现还真没认真想过,Lua源码中有一个函数详细计算了以2为底的数的近似值的方法,用来计算Lua表中哈希部分的长度值,这个值使用以2为底的对数值来保存的.
1 | //lobject.c #54 |
x小于256查表方法
数组log_2的值表示数组索引以2为底的对数近似值
比如
2^0 = 1 //索引0的x近似值为1,数组值填写0
2^1 = 2 //索引1的x近似值为2,数组值填写1
2^2 = 4 //索引2,3的x近似值为4,数组值填写2
2^3 = 8 //索引4,5,6,7的x近似值为8,数组值填写3
以下依次类推2^7 = 128,2^8 = 256;x大于256
1
while (x >= 256) { l += 8; x >>= 8; }
当x大于256时就除以256,对数值加8,x仍然可以落在256区域以内
结论
luaO_log2函数的使用1
x为非负数,当然也不能为0
当x=1时;result = l + log_2[0] => result = -1 + 0 = -1,修正结果为0
当x=256时,result = l + log_2[255] => result = -1 + 8 = 7,修正结果为8
具体参看使用