Bitscan前向测试

时间:2015-06-16 12:26:59

标签: c

我的函数应该在整数中找到LSB1的位索引。

我的问题是如何测试这是否有效?我想这个函数需要一个32位的无符号整数,但是所有测试它的尝试都证明是不成功的。我不知道这是因为我的建筑还是什么。

编辑:

#include <stdio.h>
#include <stdint.h>
#include <assert.h>


int bitscanforward(uint32_t v) 
{

static const int MultiplyDeBruijnBitPosition[32] = 
{
  0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 
  31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
};
assert(v);
return MultiplyDeBruijnBitPosition[((v & -v) * 0x077CB531U) >> 27];

}


int main()

{

   uint32_t x = 0X05FEEEEE;
   int answer = bitscanforward(x);
   printf("Index of LS1B: ");
   printf( "%d", answer );

   return 0;

}

1 个答案:

答案 0 :(得分:0)

typedef您自己的unit32是不好的做法:请注意,您的版本将无法正常工作,因为long long至少为64位)。而是使用标准定义的stdint.h。在那里,你(很可能)找到uint32_t,保证保持32位。

要验证您的代码,您可以使用unittest框架,或者只需使用经过深思熟虑的参数调用该函数并检查结果(框架几乎完全相同)。

请注意,函数的名称应该代表它实际执行的操作。你的没有。对于给定的任务,通常使用“找到第一个”/ ffo。像gcc这样的一些编译器已经为此构建了内置函数(它直接映射到某些CPU上的汇编程序指令)。