C++中x&(x-1)是什麼意思(京東筆試)

Sandwichsauce發表於2018-04-08

京東有一道筆試題問下面程式的返回值是什麼

#include "stdafx.h"
#include<iostream>
using namespace std;
int func(int x)
{
   int count = 0;
   while (x)
   {
     count++;
     x = x&(x - 1);
   }
  return count;
}
int main()
{
  cout << func(2015) << endl;
  return 0;
} 

我們知道&代表與運算,把x和x-1換算成二進位制,然後逐位運算,在兩個運算元中都有的0或1照抄下來,就是與運算的結果。

更為特殊一點,x&(x-1)就是把x的二進位制-1,或者說把x的二進位制最後一個1變成0。

  • 因為可以把x寫成(A)1(B)形式,B代表N個0,比如(10)1(00)、()1(00)、(1100)1()……
  • 然後把x-1寫成(A)0(C)形式,C代表N個1,比如(10)0(11)、()0(11)、(1100)0()……
  • 這樣x&(x-1)就是(A)0(B),即把x的二進位制最後一個1變成0

所以實際上,上面那段程式是一個計算x的二進位制中1的位數的過程。因為每一次把1變成0的過程count都++了。

------------------------------------

func(2015)=10

  • 2015 =(11111011111)2

func(9999)=8

  • 9999 =(10011100001111)2

相關文章