正整數N的二進位有多少個1
//假設N為9
//作法1 找出 N&1 << i 等於 1 << i的個數
//約要跑31次 第32位是正負符號
int n = 9;//二進位為1001
int count = 0;
for (int i = 0;i <32;i++){
if ((n & i << 1) == i << 1){
count++;
}
}
cout << count <<'\n';
//作法2 利用減法特性
// 此題來說跑2次 效能較好
//假設N=9二進位為1001
//1001 -1 = 1000 將 1001 & 1000 會變為1000
//1000 -1 = 0111 因為0不夠減1所以要向右邊借2所以 減後答案為0111
//將1000 & 0111 結果為 0 這就是結束點
//原始數值定義為N 差定義為D
//每次減完都會將最靠近右方的1變為0
//D&N 正好可以消除靠近右方的1
//例如:1000 -1 = 0111
// 1000 & 0111 = 0000
//此方法其實是在計算消除多少次1
int n2 = 9;
int count2 =0;
while(n2){
count2++;
int d = n2 -1;
n2 = n2 & d;
}
cout <<count2 <<'\n';
沒有留言:
張貼留言