剑指office--------二进制中1的个数
Posted 生活待我如初恋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指office--------二进制中1的个数相关的知识,希望对你有一定的参考价值。
题目描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
思路1:常规解法,位运算
1 class Solution { 2 public: 3 int NumberOf1(int n) { 4 int ans=0; 5 int index=1; 6 while (index!=0){ 7 if (n&index) ans++; 8 index<<=1; 9 } 10 return ans; 11 } 12 };
思路2:利用二进制特点
1 class Solution { 2 public: 3 int NumberOf1(int n) { 4 int count=0; 5 while (n){ 6 count++; 7 n=(n-1)&n; 8 } 9 return count; 10 } 11 };
n-1是将 二进制n中的最右的1变成0的操作 ,例如 101000 减去1 的 100111
(n-1)&n 则是消除最右边的1的操作 101000 & 100111 = 100000
即每操作一次就可以消除一个1。
用这个方法也可解下列问题
问题1: 判定一个整数是否是2的整数次方
如果是2的整数次方,那么其的二进制只有一个1, 即:if((n-1)&n==0) printf("YES\n");
问题2: 两个整数n与m,问最少要改变多少个数字(对其二进制操作),可以使n与m相等。
先对n与m取异或。在统计有多少个1即可。
以上是关于剑指office--------二进制中1的个数的主要内容,如果未能解决你的问题,请参考以下文章