劍指offer面試題15 二進位制中1的個數

2021-09-29 08:10:43 字數 1360 閱讀 3822

位運算相關:

左移運算子m<00001010<<2=00101000;

10001010<<3=01010000;

右移運算子m>>n表示把m右移n位。在右移n位的時候,最右邊的n位將被丟棄。但是右移時處理最左邊位的情形要複雜一點。如果數字是乙個無符號的數值,則用0來填補最左邊的n位。如果數字是乙個有符號的數值,則用數字的符號位填補最左邊的n位。即,如果數字原先為正,那麼右移後左邊補0;如果為負數,左邊補1。下邊是對兩個8位有符號數進行右移的例子。

00001010>>2=00000010

10001010>>3=11110001;

思路1:

常規解法,首先把n和1做與運算,判斷n的最低位是不是為1.接著把1左移一位得到2,再和n做與運算,就能判斷n的次低位是不是1,反覆右移,直到次數達到n的二進位制位數,就可以統計出n中1的個數。

**:

int numberof1(int n)

flag=flag << 1;

} return count;

}

複習:

這個**終止條件是flag的溢位,也就是unsigned int n左移之後,溢位了無符號整型的範圍,被截斷之後就變成了0,while迴圈就會終止。 其實這裡用有符號整型感覺也沒有問題。

二刷**:

int numberof1(int n)

return count;

}

思路2:

我們可以發現把乙個整數減去1,都是把最右邊的1變成0,。如果它的右邊還有0,則所有的0都變成1,而它左邊的所有位都不變。我們把乙個整數和它減去1的結果做位與運算,相當於把最右邊的1變成了0。比如1100,它減一得1011,再把它們做位與運算結果為1000。所以乙個整數中有多少個1,就可以進行多少次這樣的操作。所以可以寫出下面的**:

**:

int numberof1(int n)

return count;

}

複習:

不得不說,這個思路太厲害了。要記住乙個結論,將乙個數和該數減一做「&」的運算可以去除最右邊的1,但是這裡好像只能是正數,負數的話是不行的。

二刷**:

int numberof1(int n)

return count;

}

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

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

劍指offer 面試題 15 二進位制中1的個數

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。初始化無符號整型變數 bit 1。迴圈依次將 bit 與 數 做與運算,如果結果為0,則 bit 左移一位 否則計數器 count 加1,同時bit 左移一位 當 bit 為 0 時 比如乙個int 型變數佔32位,那麼 bit 左移...

劍指offer 面試題15 二進位制中1的個數

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。解決 1.位運算 乙個數減1的結果和它本身進行與運算,等於把這個數的二進位制表示中最右邊的1變成0。public int numberof1 int n return count 2.取巧 使用integer.bitcount int...