如何计算某char变量bit位为1的总数目?
比如:
char c = 'a';
而'a'二进制是01100001,所以起bit位为1的总数目是3。
请问这个如何实现?谢谢。
据说还可以有空间优化和时间优化等不同实现?
-------------eGust (就像矗立在彩虹之巅)-------------
比起
x = (x & 0x55) + ((x >> 1) & 0x55);
x = (x & 0x33) + ((x >> 2) & 0x33);
x = (x & 0x0F) + ((x >> 4) & 0x0F);
来,应该也不会慢吧,这个毕竟要进行15次以上的运算,虽然都是在寄存器里弄
查表只要一条指令就够了,就算没有cache上应该不会慢这么多吧,而且多次访问的话应该更快才对
x86好像也没有直接数的指令
-------------vonNeumann (沉默的大多数)-------------
如果只是偶尔调用一次,应该 eGust 那个更快吧。如果频繁调用,估计查表快。我猜的。
原理:
假设原数是 [abcdefgh],每一个字母代表 0 或 1,要求的是 a+b+c+d+e+f+g+h
第一步以后,变成 [a+b][c+d][e+f][g+h],每个方括号 2 bits
第二步以后,变成 [a+b+c+d] [e+f+g+h],每个方括号 4 bits
第三步以后,[a+b+c+d+e+f+g+h]