巧用位運算求解二進位制中1的個數
阿新 • • 發佈:2019-02-05
位運算是將數字化為二進位制後,對每一位的0或1進行的運算。一般的運算有與&、或|、異或^和移位等。
如何利用位運算來求解二進位制中1的個數呢?
首先大多數人想到的是先判斷最右邊的一位是不是1,接著將其右移一位,知道數為0停止。將一個數與上1則可以解決這個問題。
程式碼如下:
int NumofOne1(int num)
{
int count=0;
while(num)
{
if(num&1)
{
count++;
}
num=num>>1;
}
return count;
}
仔細思考就會發現,其實上述程式碼是存在很多問題的。如果我們傳入一個負數給這個函式,這個數將會變成0xFFFFFFFF的死迴圈。為了避免這種問題的發生,可以不進行右移運算。先將輸入的數字與上1,判斷最右邊是否為1,然後將1進行左移一位,判斷倒數第二位……以此類推。
修改程式碼如下:
int NumofOne2(int num)
{
int count=0;
unsigned int flag=1;
while(flag)
{
if(num&flag)
{
count++;
}
flag=flag<<1;
}
return count;
}
這個解法雖然避免了死迴圈的問題,但是卻要迴圈32次,可不可以讓其有幾個1就迴圈幾次呢?
可以採用將一個整數減去1,再和原整數做與運算,這樣可以把該整數最右邊一個1變成0,那麼就實現了我們所說的有多少個1就進行多少次迴圈。
程式碼如下:
int NumofOne3(int num) { int count=0; while(num) { ++count; num=(num-1)# } return count; }