我正在编写一个函数,它确定16位整数的有用位数。
int16_t
f(int16_t x)
{
/* ... */
}
例如,数字“00000010 00100101”有10个有用位。我想我应该使用一些按位运算符,但我不知道如何。我正在寻找一些方法来做到这一点。
答案 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))
会告诉您。
由于没有算法能够在恒定时间内告诉您二进制表示的前导零的数量,因此计算对数实际上可能比天真迭代更快。