我有一个20字/字节的数组,存储一个160位的数字。如何找到从msb开始的第一个非零位。我需要找到该位的位置,然后从第一个'1'位置开始我需要做一些操作。
答案 0 :(得分:5)
如果您正在使用gcc,那么内置函数正是这样做的(以及许多其他事情)
http://gcc.gnu.org/onlinedocs/gcc-4.5.4/gcc/Other-Builtins.html
您正在寻找的那个可能是__builtin_clz
(对于unsigned int),__builtin_clzl
(对于无符号长整数)或__builtin_clzll
对于无符号长整数。
来自文档:
从最高有效位开始,返回x中前导0位的数量。如果x为0,则结果为未定义
那么从最重要的事情开始,直到你发现第一个不为零的整数(长期?长龙?)。然后使用适当的__builtin_clz
查找它有多少前导零,32(64)减去该数字是您的数字中最高1
位的位置!
当然,如果你想与其他编译器兼容,你总是可以为自己实现__builtin_clz
(就像你应该的那样!)
答案 1 :(得分:0)
您可以迭代每个字节,直到找到第一个字节为!= 0.对于每个等于零的字节,将计数器递增8。
然后使用该字节,进行右移操作(>> 1),直到该值等于零。在每个班次中,将前一个计数器递增1。