快速統計正二進位制數中乙個個數

2021-07-11 19:43:40 字數 697 閱讀 4146

題目描述:

世界上有10種人,一種懂二進位制,一種不懂。那麼你知道兩個int32整數m和n的二進位制表達,有多少個位(bit)不同麼?

public

intcountbitdiff(int m, int n)

這個比較笨啊,查了一下可以快速統計正整數 dif 中1的個數。如下:

//統計乙個整數dif含有多少個1;

while(dif!=0)

這段**的精髓就是在這一句: dif=dif&(dif-1)

那麼這句語句到底起到什麼作用呢?看下面的分析

假設dif=x1x2……xn-1xn,其中xi(1≤i≤n)為1或0

不妨設xi是最右邊的1,那麼dif就可以寫成如下的形式

dif=x1x2……xi-1xi0……0,其中(1≤i≤n),xi後面有n-i個0

因為xi=1,所以dif=x1x2……xi-110……0,其中(1≤i≤n),1後面有n-i個0

則dif-1=x1x2……xi-101……1,其中(1≤i≤n),0後面有n-i個1

則difand (dif-1)=x1x2……xi-100……0,其中(1≤i≤n),xi-1後面有n-i+1個0

因此,dif &(dif-1)的效果把最右邊的1變成0

在上面的**中,每把最右邊的1變成0,則統計數加1,直到所有的1變成0為止。

13 劍指offer 二進位制中乙個個數

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。解題思路 思路一 利用bitset容器,一句話即可解決。如下 class solution 思路二 這是網上的乙個答案,我覺得很不錯,如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就...

二進位制 求乙個數的二進位制表示中1的個數

題目 求乙個正整數x中1的個數 思考 二進位制是乙個01串。統計該串中1的個數。方法1 將x按照樸素的方法轉化成二進位制串,如果x的某二進位制位上為1,則res 求得最後x中1的個數。int x while x return res res即是x的二進位制數中1的個數用這種方法求,時間複雜度為o n...

轉換成二進位制翻轉乙個數

實現函式unsigned int reverse bit unsigned int value 這個函式的返回值是value的二進位制位模式從左到右翻轉後的值。如 在32位機器上25這個值包含下列各位 00000000000000000000000000011001 翻轉後 2550136832 1...