总结1:汉明权重问题
计算 011010101010101110001数字有多少个1,采用以下公式,
循环x = x & (x - 1);直到x = 0
原理, x&(x-1)使得x最低位的1变为0,假设 x = 1011(二进制),就是x = 12,
(1) x = x & (x-1) ==========> x = 1010 (1011 & 1010 = 1010)
(2) x = x & (x-1) ==========> x = 1000 (1010 & 1001 = 1000)
(3) x = x & (x-1) ==========> x = 0000 (1000 & 0111 = 0000)
总结2:计算1-n的汉明权重问题,要求时间复杂度O(n),空间复杂度O(n)
采用DP,动态规划思想,公式包括以下两种,两种都可以,选择一种即可
dp[x] = dp[x>>1] + (x % 2);
dp[x] = dp[(x & (x-1))] + 1;
第一个表示,每个元素等于 【x/2的计数值】 再加上 【x最低位是1还是0】,
举个例子 1101 除以二等于, 110,有两个1,再加上最末尾的1就是3个1,1101的个数为1。
第二个利用了汉明权重问题的公式, x&(x-1)使得x最低位的1变为0,那么我们把1加上就可以还原x中1的个数。
举个例子 求 xxxx01000 的个数,现在已知xxxx00000的1的个数是10,那么 xxxx01000 的1的个数是11。