劍指offer 015(二進位制中1的個數)

2021-08-15 02:37:50 字數 1413 閱讀 4604

《劍指offer》目錄索引

問題描述:

請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如:把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2

思路1:

求二進位制1的個數,首先想到操作符&(按位與),&規則:0&1=1 1&1=1

採用&的規則,對應的二進位制位&1,並統計1的個數

例:求9的二進位制有幾個1

9 & 1 (由於二進位制序列前面都是0,故只寫低8位):

0000 1001

0000 0001 & 1

00000001

按位與1的結果判斷最低位是1;

之後每次將1左移一位,可判斷剩餘的每一位是否為1

**:

int numberofonecount(int n)

flag = flag<<1;

}return

count;

}

注意:下面這句**不可寫成if((n&flag)==1);因為flag左移後的二進位制序列對應的不是1

if((n&flag)!=0)
思路2:

上面的演算法每次迴圈32次,效率較低,因此採用下面這種演算法:n&(n-1) 這種演算法的迴圈次數為二進位制序列中1的個數

例: 9 的二進位制序列:0000 1001

8 的二進位制序列:0000 1000

按位與後的序列:00001000

此時count為1,n=8

8 的二進位制序列:0000 1000

7 的二進位制序列:0000 0111

按位與後的序列:00000000

此時count為2,即為9的二進位制序列1的個數

**:

int numberofonecount1(int n)

return

count;

}

測試**及結果:

void test()

void test1()

結果:

劍指Offer 擴充套件 二進位制 小公尺

世界上有10種人,一種懂二進位制,一種不懂。那麼你知道兩個int32整數m和n的二進位制表達,有多少個位 bit 不同麼?輸入例子 1999 2299 輸出例子 7 分析 將兩個整數逐位進行比較,累加不同位的個數,直至兩個數都為0.比較兩個數的最後一位,然後分別右移一位,直至兩個數都為0.defin...

劍指Offer 二進位制中1的個數

題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。1 可能引起死迴圈的解法 先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原來處於從右邊數起的第二位被移到最右邊了,再判斷最右邊的...

劍指Offer 二進位制中1的個數

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。錯誤解法 public class solution return num 若輸入的數字為負數,因為為補碼表示方式,所以高位一直是1,所以會陷入死迴圈。方法一 從高位開始計算 public class solution return ...