剑指offer面试题15----二进制中1的个数

基础知识:

(1)与,或,异或运算

   与&     0&0=0  0&1=1  1&0=0   1&1=1

   或|     |两边有一个1结果就是1

   异或^   ^两边若都是0或者都是1则结果是0,否则是1

(2)左移,右移运算符

      m<<n表示    把m左移n位   左移不需考虑n正负,只需右补0,左丢弃

       m>>n表示    把m右移n位。右移要考虑n正负。若n是有符号数(左补符号位,负数补1 正数补0),右丢弃


例题

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

解法一

class Solution {
public:
     int  NumberOf1(int n) {
         unsigned int cur=1;
         int Num=0;
         while(cur)
         {
             if(n&cur)
                 ++Num;
             
             cur=cur<<1;
            
         }
             return Num;
         
     }
};

分析,上面方法是通过左移cur逐位与n与,不能右移n,逐位与1与,因为若n是负数,右移n将导致n最后变成0xFFFFFFFF,程序死循环

方法二

思想:把一个整数减去1,再和原整数与,相当于该整数最右边的1变成0

int NumberOf1(int n)
{
	int count = 0;
	while (n)
	{
		++count;
		n = (n - 1)&n;
	}
	return count;
}


猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/80987236