我正在寻找比以下更快的算法。给定一个64位无符号整数序列,返回序列中设置的每个64位的次数。计算无符号长整数中的常见位
例子:
4608 = 0000000000000000000000000000000000000000000000000001001000000000
4097 = 0000000000000000000000000000000000000000000000000001000000000001
2048 = 0000000000000000000000000000000000000000000000000000100000000000
counts 0000000000000000000000000000000000000000000000000002101000000001
例子:
2560 = 0000000000000000000000000000000000000000000000000000101000000000
530 = 0000000000000000000000000000000000000000000000000000001000010010
512 = 0000000000000000000000000000000000000000000000000000001000000000
counts 0000000000000000000000000000000000000000000000000000103000010010
目前我使用的是相当明显的,幼稚的做法:
static int bits = sizeof(ulong) * 8;
public static int[] CommonBits(params ulong[] values) {
int[] counts = new int[bits];
int length = values.Length;
for (int i = 0; i < length; i++) {
ulong value = values[i];
for (int j = 0; j < bits && value != 0; j++, value = value >> 1) {
counts[j] += (int)(value & 1UL);
}
}
return counts;
}
您在64位操作系统上运行的权利? – 2009-10-05 02:42:38
我的新想法将速度提高了8倍? – 2009-10-05 02:59:24
@ csharptest.net:是的,Windows 7 x64。 – jason 2009-10-05 12:05:02