(function(){ function getOne(n) { var c = 0; for(var i = 0;i < 32;i ++){ if(((1 << i) & n) != 0){ c++; } } return c; } console.log(getOne(10)); console.log(getOne(-10)); })(); //比較最低位是否為1,複雜度O(logn),僅適合正數,當是負數,將出現死迴圈 function getOne(n){ var c = 0; while(n){ if(n&1){ c ++; } n >>= 1; } return c; } //同上,適合所有的數 function getOne(n){ var c = 0; while(n != 0){ if((n & 1) != 0){ c++; } n >>>= 1; } return c; } function getOne(n) { var c = 0; for (var i = 1; i; i <<= 1) { if (i & n) { c++; } } return c; } //int型別的是32位的數字,故只需要統計這32位上的數字的1的個數 function getOne(n) { var c = 0; for(var i = 0;i < 32;i ++){ if(((1 << i) & n) != 0){ c++; } } return c; } //快速去掉最低位1 function getOne(n){ var c = 0; while(n){ n = n &(n - 1); c++; } return c; }
public class BinaryOneCount { public static void main(String[] args) { new BinaryOneCount().start(); } private void start() { int n = -10; countOne(n); countOne(n = 10); countOne(n = 103); countOne(n = 30); } private void countOne(int n) { System.out.println(Integer.toBinaryString(n)); System.out.println(Integer.bitCount(n)); countBinaryOneBit(n); countBinaryOneBit1(n); countBinaryOneBit2(n); } /** * 檢視當前最低位是否為1,是加1,否則就將當前數字無符號左移1位,進行下一輪判斷 * @param n */ private void countBinaryOneBit(int n) { int c = 0; while (n != 0) { if ((n & 1) != 0) { c++; } n >>>= 1; } System.out.println(c); } /** * 每次迴圈將最低位1去掉,這樣進行的次數就是1的個數 * @param n */ private void countBinaryOneBit1(int n) { int c = 0; while (n != 0) { n &= (n - 1); c++; } System.out.println(c); } /** * 由於是32位的Int型別的數字,故只需要統計這32位上的數字1的個數 * @param n */ private void countBinaryOneBit2(int n){ int c = 0; for(int i = 0;i < 32;i ++){ if((n&(1<<i)) != 0){ c ++; } } System.out.println(c); } }