我需要用二进制操作(&, ^, >>)写一个字节汉明重量的表达式,而不需要任何循环,只需要一个公式。虽然有很多算法可以计算汉明重量,但它们都使用算术操作或循环。如果我们采用维基百科中Hamming weight的算法,那么第一项和为D = B^C^(B&C << 1),但后面两个和更复杂。请问有什么提示吗?
更新: 谢谢大家的帮助,实际上我需要的是以下内容:
更新: 谢谢大家的帮助,实际上我需要的是以下内容:
int popcount_1(unsigned char in){
unsigned char m1 = 0x55;
unsigned char m2 = 0x33;
unsigned char m4 = 0x0f;
unsigned char B,C = 0;
unsigned char x = in;
x = (x & (x << 1) & (m1 << 1)) | (m1 & (x ^ (x >> 1)));
B = x & m2;
C = (x >> 2) & m2;
x = B ^ C ^ ((B & C) << 1);
B = (x & m4 ) ^ ((x >> 4) & m4);
C = (x & ((x >> 4) & m4)) << 1;
x = B ^ C ^ ((B & C) << 1);
return x;
}
这段代码将会得到变量in的汉明重量。它不包含任何+、-或比较指令,可以在8位微控制器上工作。然而,它需要更多的操作比大多数其他解决方案。现在,我正在尝试简化它。
更新2:@Evgeny Kluev提出了另一种基于64位寄存器的解决方案。
pshufb
:http://wm.ite.pl/articles/sse-popcount.html - harold