劍指offer--二進位制中的1的個數--補碼
阿新 • • 發佈:2019-02-04
題目描述
在計算機系統中,數值一律用補碼來表示和儲存。
正數補碼就是原碼;如+9,的原碼和補碼都是一樣:1001; 負數補碼是原碼取反再加1:如-5的補碼: -5對應正數5(00000101)→所有位取反(11111010)→加1(11111011) 所以-5的補碼是11111011。 同一個數字在不同的補碼錶示形式中是不同的。比如-15的補碼,在8位二進位制中是11110001,然而在16位二進位制補碼錶示中,就是1111111111110001。以下都使用8位2進位制來表示。
輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。
首先複習一下補碼。。這道題考的位運算 --> 位運算
計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同。在計算機系統中,數值一律用補碼來表示和儲存。
正數補碼就是原碼;如+9,的原碼和補碼都是一樣:1001; 負數補碼是原碼取反再加1:如-5的補碼: -5對應正數5(00000101)→所有位取反(11111010)→加1(11111011) 所以-5的補碼是11111011。 同一個數字在不同的補碼錶示形式中是不同的。比如-15的補碼,在8位二進位制中是11110001,然而在16位二進位制補碼錶示中,就是1111111111110001。以下都使用8位2進位制來表示。
public class 二進位制中1的個數 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(NumberOf3(10)); } /*把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0. * 那麼一個整數的二進位制有多少個1,就可以進行多少次這樣的操作。 * 這樣迴圈次數就等於1的個數*/ public int NumberOf1(int n) { int count =0; while (n!=0) { n = n&(n-1); count++; } return count; } /*挨個做位運算,為1的就加一次*/ public int NumberOf12(int n) { int count =0; int flag = 1; while (flag!=0) { if ((flag&n)==1) { count++; } flag=flag<<1; } return count; } /*用API。 讓我用API 也想不出來。*/ public static int NumberOf3(int n) { return Integer.toBinaryString(n).replaceAll("0","").length(); } }