整形數字存放的方式都是以二進位制補碼儲存
列印的是原碼,
轉換規則,原碼-取反->得反碼,反碼-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方法一 ...