神奇的位運算——二進位制中1的個數
阿新 • • 發佈:2019-01-23
輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。
方法1:依次右移,使最右側的1依次消失。但需要注意負數右移後會在高位補1,需要將負數轉換為無符號數。
int NumberOf1(int n)
{
int cnt = 0;
unsigned ui = (unsigned)n; //轉換為無符號數
while (ui!=0)
{
int a = ui & 1; //與1做位與運算
if (a == 1) //最後一位為1
cnt++;
ui = ui >> 1; //右移
}
return cnt;
}
方法2:與n-1相與,同樣可以使最右側的1消失。n-1可以從最右側的一個1開始,讓所有位取反。n&(n-1)後可以讓最右側的1消失。
int NumberOf1(int n)
{
int cnt = 0;
while (n!=0)
{
n = n&(n - 1);
cnt++;
}
return cnt;
}