我最近决定我需要为我的Timer类从使用毫秒更改为微秒,经过一些研究后,我认为QueryPerformanceCounter可能是我最安全的选择.(关于Boost::Posix它可能不适用于Win32 API 的警告让我有点失望).但是,我不确定如何实现它.
我正在做的是调用GetTicks()我正在使用的任何esque函数并将其分配给Timer的startingTicks变量.然后找到通过的时间量我只是从中减去函数的返回值startingTicks,当我重置计时器时,我再次调用该函数并为其分配startingTicks.不幸的是,从我看到的代码中,它并不像调用那么简单QueryPerformanceCounter(),而且我不确定我应该传递什么作为它的参数.
好吧,听起来有点复杂,但这正是我想要做的:
10101010101{ 0, 2, 4, 6, 8, 10 }- 一个包含所有位置的数组这是我的代码:
UINT DQBitboard::firstBit(U64 bitboard)
{
static const int index64[64] = {
63, 0, 58, 1, 59, 47, 53, 2,
60, 39, 48, 27, 54, 33, 42, 3,
61, 51, 37, 40, 49, 18, 28, 20,
55, 30, 34, 11, 43, 14, 22, 4,
62, 57, 46, 52, 38, 26, 32, 41,
50, 36, 17, 19, 29, 10, 13, 21,
56, 45, 25, 31, 35, 16, 9, …Run Code Online (Sandbox Code Playgroud) 对于与此问题相关的代码,我需要尽快计算以下内容:
给定32位整数i,计算第n个最低有效位集的位置.无论ñ和结果应该是0索引.
例如,给定数字i = 11010110101 2且n = 4,所需数字为7,因为第四设置位在位置7:110 1 0110101.
使用pdep来自x86的BMI2指令集扩展的指令和常用的__builtin_ctz()内部函数,可以很容易地计算出来:
j = _pdep_u32(1 << n, i);
return (__builtin_ctz(j));
Run Code Online (Sandbox Code Playgroud)
但是,许多计算机没有pdep指令,这种方法略显不切实际.你也可以不用pdep这样计算这样的位位置:
j = i;
for (k = 0; k < n; k++)
j &= j - 1;
return (__builtin_ctz(j));
Run Code Online (Sandbox Code Playgroud)
但是,这很慢.
我瞄准的是至少提供电脑__builtin_popcount()和__builtin_ctz().如何更快地找到这样的位位置?