求二進位制中1的個數

2021-07-22 02:07:46 字數 1092 閱讀 1302

解法有很多種:以乙個位元組無符號位元組變數作為例子

解法一:求餘法

在將十進位制數轉換為二進位制數時,採用除2取餘法。將每次除2得到的餘數儲存起來逆序輸出便是該十進位制整數的二進位制表示。因此可以採用這種方法去統計1的個數。

public int count(byte n)

return sum;

}

解法二:位運算

public int count(byte n)

return sum;

}

解法三:快速法

2中所述方法的迴圈次數始終為8,有一種方法可以減少這個迴圈次數。就是採用減1再進行與的運算,這樣每進行一次,就會少乙個1.

比如: 0010 0110 減1得 0010 0101 &0010 0110等於0010 0100.原因在於比如r1r2...rn,如果最後面位1的一位為rk,則該數減1之後二進位制的表示形式中rk肯定為0,但是r(k+1)...rn則全部為1,與原來的數進行與操作不會印象到rk前面的1的個數,因此每進行一次,則可以消去乙個二進位制1。

public int count(byte n)

return sum;

}

例如:0100 0010&0100 0001 = 0100 0000 sum=1, 0100 0000&0011 1111 = 0000 0000 sum=2,exit; 

解法四:查表法

乙個位元組的無符號整型資料範圍就在[0,255]之間,因此可以直接定義乙個長度為256的陣列table[0-255],把0-255二進位制表示中1的1的個數賦給陣列的元素,這樣直接進行查詢。

不適合比較大的數

int table[256]=;

public int count(byte n)

問題擴充套件:給定兩個整數a和b(二進位制表示),問把a變為b需要改變多少位?也就是說,a和b的二進位制表示中有多少位是不同的。

解:1:利用位運算的方法每次求出a和b最低位數然後進行比較是否相等,不相等+1即可。

2:先將a和b異或,然後使用快速法,求其中1的個數即可。

求二進位制中1的個數

在 程式設計之美 一書中有一節提到如何求乙個位元組的無符號整型變數二進位制表示中中1的個數,主要提到了四種方法。下面簡單介紹一下 1.求餘法 在將十進位制數轉換為二進位制數時,採用除2取餘法。將每次除2得到的餘數儲存起來逆序輸出便是該十進位制整數的二進位制表示。因此可以採用這種方法去統計1的個數。i...

求二進位制中1的個數

這是乙個經常會在筆試和面試中遇到的題目,今天我做到了這個題目,就來分享一下我對這個題目的解決思路。首先拿到這個題目,我們的基本思路是 先判斷最後一位是否為1,接著把數字依次右移,判斷每一位是否為1,直到整數變為0為止。基於這個思路我們可以寫下如下的 int count int n n n 1 ret...

求二進位制中1的個數

如何快速的求乙個數二進位制表示時1的個數呢。除了用n n 1 外,還可以用下面的這種方法。1.最開始把相鄰奇數字和偶數字相加 2.然後相鄰4位相加,相鄰8為相加,相鄰16為的相加。得到最後1的個數。這種做法的複雜度的是log 位數 include include include using name...