面试题之 位运算

0001010<<2=00101000

右移运算符m>>n表示m右移n位,正数右移之后再最左边补n个0;如果数字原先是负数,则右移之后在最左边补n个1;、

 1 int NumberOf1(int n)
 2 {
 3     int count=0;
 4 while(n)
 5 {
 6    if(n&1)
 7        count++;
 8    n=n>>1;
 9 }
10 return count;
11 }



整数右移一位和把整数除以2在数学上是等价的,但是上面的代码不能换成除以2,因为除法的效率比移位运算要低很多,在实际编程中尽可能的使用位移运算代替乘除法运算
同时上面的代码如果n是负数的话,就可能造成死循环

 1 int NumberOf1(int n)
 2 {
 3    int count=0;
 4    unsigned int flag=1;
 5    while(filag)
 6   {
 7     if(n&flag)
 8           count++;
 9 
10     flag=flag<<1;
11   }
12 
13 return count;
14 }

代码如下:

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

原文地址:https://www.cnblogs.com/lyunyu/p/3379778.html