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

2021-07-11 03:14:39 字數 3185 閱讀 5005

牛客oj:二進位制中1的個數

九度oj:

github**: 010-二進位制中1的個數

csdn題解:劍指offer–010-二進位制中1的個數

牛客oj

九度oj

csdn題解

github**

二進位制中1的個數

1513-二進位制中1的個數

劍指offer–010-二進位制中1的個數

010-二進位制中1的個數

您也可以選擇回到目錄-劍指offer–題集目錄索引

題目描述

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。

樣例輸入

3

4 5

-1

樣例輸出

1

2 32

我們很容易想到的演算法就是

通過移位的方法,挨個判斷其每一位

class solution

n >>= 1;

}return count;

}};

但是這個演算法有致命的缺陷,我們假設通過移位的方式可以獲取到其每一位,但是並不總是對的

比如乙個有符號位的8位二進位制數11001101,邏輯右移就不管符號位,如果移一位就變成01100110。算術右移要管符號位,右移一位變成10100110。

e.g:1010101010,其中位是新增的數字

邏輯左移一位:010101010[0]

算數左移一位:010101010[0]

邏輯右移一位:[0]101010101

算數右移一位:[1]101010101

因此如果輸入負數,那麼我們的演算法簡單的判斷是不是0來終結,豈不是要死迴圈

為了負數時候避免死迴圈,我們可以不右移數字n,轉而去移動測試位

那麼思考我們的迴圈結束條件,flag一直左移(乘以2),當超出表示標識範圍的時候,我們就可以終止了,但是這樣子的話,最高位的符號位沒有測試,因此要單獨測試,同時由於會溢位,我們的flag需要用long來標識

型別範圍

unsigned int

0~4294967295

int2147483648~2147483647

unsigned long

0~4294967295

long

2147483648~2147483647

long long

最大值:9223372036854775807

long long

最小值:-9223372036854775808

unsigned long long

最大值:1844674407370955161

__int64

最大值:9223372036854775807

__int64

最小值:-9223372036854775808

unsigned __int64

最大值:18446744073709551615

**如下

class solution

flag <<= 1;

}// 由於迴圈終結,我們使用的是flag <= int_max

// 因此前面的迴圈只會執行31次

if((n & flag) != 0) // 最後測試符號位

return count;

}};

繼續考慮,有沒有什麼能夠精簡我們的迴圈條件,

考慮這點,如果資料發生溢位的話,會被截斷,截斷以後是多少呢,0

**如下

class solution

flag <<= 1;

}debug <" & "

<" == "

<<(n & flag) }

};

這種方法迴圈的次數正好是是整數二進位制數的位數,比如int就是32位迴圈32次

那麼有沒有一種方法,整數中有幾個1就迴圈幾次呢?

我們分析n以n-1兩個數的差別,

因此通過分析發現:

把乙個整數n減去1,再和原來的整數做與運算,會把該整數最右邊乙個1變成0,那麼該整數有多少個1,就會進行多少次與運算

即迴圈的次數,即二進位制中1的個數

如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1(如果最右邊的1後面還有0的話)。其餘所有位將不會受到影響。

舉個例子:乙個二進位制數1100,從右邊數起第三位是處於最右邊的乙個1。減去1後,第三位變成0,它後面的兩位0變成了1,而前面的1保持不變,因此得到的結果是1011.我們發現減1的結果是把最右邊的乙個1開始的所有位都取反了。這個時候如果我們再把原來的整數和減去1之後的結果做與運算,從原來整數最右邊乙個1那一位開始所有位都會變成0。如1100&1011=1000.也就是說,把乙個整數減去1,再和原整數做與運算,會把該整數最右邊乙個1變成0.那麼乙個整數的二進位制有多少個1,就可以進行多少次這樣的操作。

#include 

using

namespace

std;

// 除錯開關

#define __tmain main

#ifdef __tmain

#define debug cout

#else

#define debug 0 && cout

#endif // __tmain

class solution

return count;

}};#include

int __tmain( )

stl中用來方便地管理一系列的bit位而不用程式設計師自己來寫**。

bitset除了可以訪問指定下標的bit位以外,還可以把它們作為乙個整數來進行某些統計

class solution

};

劍指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 ...