标签:sub open tle ++ 计算 tput 接下来 describe scribe
2
首先复习下原码、反码、补码(样例中均按照32位二进制计算)
原码:将整数取绝对值后转化为二进制,例如5的原码是 :00000000 00000000 00000000 00000101
反码:将原码按位取反:例如00000000 00000000 00000000 00000101按位取反后得到:11111111 11111111 11111111 11111010
补码:负数用补码表示。计算规则为:补码=反码+1
例如 -5的补码按下列步骤计算:
首先计算原码得到:00000000 00000000 00000000 00000101
接下来计算反码得到:11111111 11111111 11111111 11111010
最后计算补码得到:11111111 11111111 11111111 11111011
回到题目本身,最暴力的方法就是模拟上述步骤,这里不再展开。
我们考虑一个事实:
假设有:00000000 00000000 00000000 00010100
很显然上述减一得到:00000000 00000000 00000000 00010011
两者取&得到:00000000 00000000 00000000 00010000
我们可以发现 n&(n-1)后的结果,仅仅将n右侧第一个1改为了0
所以 我们循环执行上述操作,统计执行了多少次上述改变 就可以计算出n的二进制中1的个数
class Solution { public: int NumberOf1(int n) { int ans = 0; while(n != 0) { ans++; n = n&(n-1); } return ans; } };
标签:sub open tle ++ 计算 tput 接下来 describe scribe
原文地址:https://www.cnblogs.com/alan-W/p/14227625.html