c語言 計算儲存中補碼1的個數詳解(演算法)

2021-10-23 18:11:30 字數 1459 閱讀 6384

整形數字存放的方式都是以二進位制補碼儲存

列印的是原碼,

轉換規則,原碼-取反->得反碼,反碼-1得補碼

當然正數的原反補相同

那麼如何計算乙個數的二進位制的補碼有幾個1呢

三,高階版(最優解)

總結emmm什麼加剝落法。

舉乙個例子123這個數字你要拿到分別拿到1,2,3怎麼辦

那就一層一層剝落下來

123%10得3

123/10去掉3得12

12%10=2

12/10=1

這樣就拿到了,那如果是二進位制的話一樣可以,二進位制/2,%2即可

int num =0;

int count =0;

scanf

("%d"

,& num)

;//3 - 011

// 統計num的補碼中有幾個1

while

(num)

printf

("%d\n"

, count)

;

問題是不能計算負數

**如下(示例):

for

(int i =

0; i <

32; i++)}

printf

("%d\n"

, count)

;

可解決負數的問題

// 00000000000000000000000000011 // 00000000000000000000000000001 // 00000000000000000000000000001 如果乙個數二進位制最低位按位與(&)上乙個上1,結果為0的話那麼這個數的末尾結果一定是0 如果是1那麼他的末尾一定是個1 那麼怎麼拿他的末尾和1去(&)操作呢 那就得想到 右移操作符: 1.算術右移 右邊丟棄,左邊補原符號位 2.邏輯右移

**如下

原理

n = n&(n-1)依次最右邊的1消失,執行一次去掉乙個1,那麼執行幾次就有幾個1

13

101 n

1100 n-1

1100 n

1011 n-1

1000 n

0111 n-1

0000 n

學好操作符還是挺重要的,估計面試題也多

求數補碼中1的個數

有n個正整數的範圍內請你輸出這n個正整數的補碼中存在有多少個1?時間限制 2 sec 記憶體限制 128 mb 每乙個輸入檔案只有一組測試資料 第一行為n,1 n 2e6 接下來有n個64位的正整數 保證測試檔案所有數補碼中1總數佔的比率在10 左右 輸出補碼中1的個數 378 25如果直接暴力求解...

C語言計算乙個數中1的個數

計算乙個無符號整型數中1的個數有兩種方法 第一種很容易想到,將數迴圈右移1位直到數為零,每次與1相與,結果為真表示該位為1。用unsigned型別是為了保證數在右移時,無論該程式在什麼機器上執行,左邊空出的位都用0而不是符號位填補。int bitcount unsigned x 第二種方法比較巧妙利...

C語言 1的個數

description 給定乙個十進位制整數n,求其對應2進製數中1的個數。input 第乙個整數表示有n組測試資料,其後n行是對應的測試資料,每行為乙個整數。output n行,每行輸出對應乙個輸入。sample input 42 1001000 66sample output 13 62方法一 ...