如何从msb开始找到第一个非零位

时间:2013-08-03 08:33:35

标签: c

我有一个20字/字节的数组,存储一个160位的数字。如何找到从msb开始的第一个非零位。我需要找到该位的位置,然后从第一个'1'位置开始我需要做一些操作。

2 个答案:

答案 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。