计算二进制形式中1的数量这种问题,在各种刷题网站上比较常见,以往都是选择最笨的遍历方法“蒙混”过关.在了解Redis的过程中接触到了variable precision SWAR算法(以下简称VP-SWAR算法),算法异常简洁,是目前已知的同类方法中最快的.但如果对于位运算不是很熟悉的话,却不一定容易理解,所以有必要记录一下. 下面先看看VP-SWAR算法的完整实现,然后再逐行解释. public int vpSWAR(int i){ i = (i & 0x55555555) + ((i>&…
BITCOUNT命令是统计一个位数组中非0进制位的数量,数学上称作:”Hanmming Weight“ 目前效率最好的为variable-precision SWAR算法,可以常数时间内计算出多个字节的非0数目,算法设计的非常精巧,值得学习. int swar(uint32_t i) { // (A) i = ( i & ) & 0x55555555); // (B) i = (i & ) & 0x33333333); // (C) i = (i & ) &…
苏君君出了一道题,是牛客网上面的: 输入一个int型整数,输出该数二进制表示中1的个数.其中负数用补码表示. 其实这道题并不难,大家很容易想到的解法是转成字符串的思路,即如下所示: public static int NumberOf1(int n) { String s = Integer.toBinaryString(n); int count = 0; for (int i = 0; i < s.length(); i++) { if(s.charAt(i) == '1'){ count+…