面试题之 位运算
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; }