如何确定一个数字的有用位数?

时间:2012-06-20 15:06:49

标签: c bitwise-operators

我正在编写一个函数,它确定16位整数的有用位数。

int16_t
f(int16_t x)
{
    /* ... */
}

例如,数字“00000010 00100101”有10个有用位。我想我应该使用一些按位运算符,但我不知道如何。我正在寻找一些方法来做到这一点。

3 个答案:

答案 0 :(得分:2)

如果您正在使用gcc(或与gcc兼容的编译器,如ICC),那么您可以使用内置的内在函数,例如。

#include <limits.h>

int f(int16_t x)
{
    return x != 0 ? sizeof(x) * CHAR_BIT - __builtin_clz(x) : 0;
}

这假设您只需要最后一个前导零位右侧的位数。

对于MSVC,您可以使用_BitScanReverse进行一些调整。

否则,如果您需要将其设为便携式,那么您可以实现自己的通用clz功能,请参阅例如http://en.wikipedia.org/wiki/Find_first_set

答案 1 :(得分:2)

这些称为位扫描操作,在intel架构上有汇编指令(可以直接从C调用)see here。如果您使用的是MS编译器tart from here

答案 2 :(得分:0)

对数计算表示特定数字到某个基数所需的位数:

[x]x,四舍五入到下一个整数。

然后[log_b(x)]是将x表示为基础b所需的位数。

因此,如果您想知道C中某些x的有效位数,那么ceil(log2(x))会告诉您。


由于没有算法能够在恒定时间内告诉您二进制表示的前导零的数量,因此计算对数实际上可能比天真迭代更快。