1.数组元素只有1bit进行求解:
1.令m满足,构建m个1bit宽的计数器
,其中
为1bit单元。carry为进位到当前位的值。
进位 | 计算后 | |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
所以有:
......
2.当计数器m值等于k时,需要将计数器m清零,而不等于k时,无需操作,此时可以如下操作:
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
当 时
可得到公式:
当 时
令1bit数mark = ~(),然后对计数器m的每一位进行与mark与操作,可以保证当m值等于k时,m置零。
2.数组元素32bit进行求解:
此时可以构建32个m-bit宽的计数器,即将数组元素的每一位作为一个0/1的1bit数组进行求值,可表现为m个32位数,这m个32位数的同一位构成一个m-bit宽的计数器,根据k的数值去构建32位mark,再去判断m-bit宽的计数器是否需要清零。由于第j位bit值处的m-bit宽的计数器中记录的是该位中出现1的次数,所以当出现p次的数组元素的某一位(i)是1,用二进制表示的1的位置(j)指代的第i个m-bit宽的计数器第j位肯定为1,即当
时,返回值为