劍指Offer面試題 9 二進位制中1的個數

2021-09-08 20:35:55 字數 2427 閱讀 4463

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

乙個基本的思路:先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原來處於從右邊數起的第二位被移到最右邊了,再判斷是不是1。這樣每次移動一位,直到整個整數變成0為止。

怎麼判斷乙個整數的最右邊是不是1:只要把整數和1做位與運算看結果是不是0就知道了

public

static

int numberof1solution1(int

n)

n = n >> 1

; }

return

count;

}

ps:右移運算子m>>n表示把m右移n位。右移n位的時候,最右邊的n位將被丟棄。如果數字原先是乙個正數,則右移之後在最左邊補n個0;如果數字原先是負數,則右移之後在最左邊補n個1。例如下面對兩個八位二進位制數進行右移操作:

00001010>>2=00000010

10001010>>3=11110001

那麼,問題來了:上面的方法如果輸入乙個負數,比如0x80000000,如果一直做右移運算,最終這個數字就會變成0xffffffff而陷入死迴圈

為了避免死迴圈,我們可以不右移輸入的數字i:

(1)首先把i和1做與運算,判斷i的最低位是不是為1。

(2)接著把1左移一位得到2,再和i做與運算,就能判斷i的次低位是不是1。

(3)這樣反覆左移,每次都能判斷i的其中一位是不是1。

public

static

int numberof1solution2(int

n)

flag = flag << 1

; }

return

count;

}

ps:這個解法中迴圈的次數等於整數二進位制的位數,32位的整數需要迴圈32次。

把乙個整數減去1,再和原整數做與運算,會把該整數最右邊乙個1變成0。那麼乙個整數的二進位制表示中有多少個1,就可以進行多少次這樣的操作。

ps:把乙個整數減去1之後再和原來的整數做位與運算,得到的結果相當於是把整數的二進位制表示中的最右邊乙個1變成0。很多二進位制的問題都可以用這個思路解決。

//

輸入0,期待的輸出是0

[testmethod]

public

void

numberofoneinbinarytest1()

//輸入1,期待的輸出是1

[testmethod]

public

void

numberofoneinbinarytest2()

//輸入10,期待的輸出是2

[testmethod]

public

void

numberofoneinbinarytest3()

//輸入0x7fffffff,期待的輸出是31

[testmethod]

public

void

numberofoneinbinarytest4()

//輸入0xffffffff(負數),期待的輸出是32

[testmethod]

public

void

numberofoneinbinarytest5()

//輸入0x80000000(負數),期待的輸出是0

[testmethod]

public

void

numberofoneinbinarytest6()

(1)測試通過情況:

(2)**覆蓋率:

出處:

面試題 二進位制

之前論壇看到乙個面試題,很基礎的考察按位符運算,總結如下 按位與 只有對應的兩個二進位均為1時 結果位才為 1,否則為0。舉例 比如9 5,其實就是1001 101 1,因此9 5 1 規律 二進位制中,與 1相 就保持原位,與 0相 就為 0int fun int nvalue return nc...

劍指Offer精選程式設計面試題15 二進位制中1的個數

2 思路 3 與測試 要求 輸入乙個整數,輸出該數二進位制表示中1的個數。如輸入9,則輸出2。總體來分三種 思路一弊端 此操作輸入負數的時候容易引發死迴圈,因為負數移位的時候最高位會設為1,容易陷入死迴圈。思路二弊端 此操作的迴圈次數為整數二進位制的位數,為常規解法。思路三優勢 此操作的迴圈次數為整...

劍指Offer 面試題10 二進位制中1的個數

請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1.因此如果輸入9,該函式輸出2.注意 整數和負數以及0的區別,這是由儲存機制決定的。分析 將輸入的整數依次右移並與1相位與!源 如下 includeusing std cout using st...