LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1543|回复: 1

求助:有个函数看不懂

[复制链接]
发表于 2007-11-22 15:42:10 | 显示全部楼层 |阅读模式
/* Return the bit position of the most significant 1 bit in a word */
static inline int __ilog2(register unsigned int x)
{
    register int lz;
    asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x));
    return 31 - lz;
}
这个函数究竟是返回x最左边的第一个1的位置,还是最右边的第一个1的位置?查看了ppc的手册,好像cntlzw应该是返回最左边的,那么再用31来减,不就变成最右边的了?
可是最重要的位应该是从左边数起的吧?搞不懂。特此求助,谢谢!
发表于 2007-12-9 02:24:00 | 显示全部楼层
ilog2的意思嘛,就是log2(lz)。MSB是左边数起的,但函数的作用是确定MSB的位置,而位置是从右边数起的。如00000000 00000000 00001000 00001000,cntlzw的结果是8+8+4=20,则返回31-20=11,就是说MSB在右起第11位。其实际意义就是,这个数的第一个1后面有11位,即log2(00000000 00000000 00001000 00001000)==11,log2(2056)==11。你自己把自己弄糊涂了吧……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表