【发布时间】:2018-09-18 10:36:23
【问题描述】:
我正在寻找一种算法来确定像 0x200 这样的 16 位 (uint16_t) 变量中的哪一个位(始终只有一个位集)。我发现了一个非常不错的简短有效的代码来使用 8 位变量的查找表来执行此操作,如下所示:
int[] lookup = {7, 0, 5, 1, 6, 4, 3, 2};
int getBitPosition(unsigned char b) {
return lookup[((b * 0x1D) >> 4) & 0x7];
}
如何扩展它以使用 16 位作为输入?
【问题讨论】:
-
请注意,这个问题相当于一个数字的 log2,它是 2 的精确幂,或“计数前导零”、“计数尾随零”或“查找第一个设置位”。参见例如this question 及其各种副本。还有this question 及其各种副本。
-
使用 ffs 或 clz 函数。
-
数一数。结果必须除以 2 才能得到 0 的次数
-
int[] lookup==>>int lookup[] -
@PaulR 请不要建议关闭帖子作为重复,如果需要,之后很难删除已关闭的帖子。此外,在其中混入
log函数也不是很有帮助,因为它使用浮点数。
标签: c bit-manipulation