編程之美1——一個數的二進位表示中1的個數,之美二進位
這裡要介紹3種解法
第一種;(常規解法)
數在電腦內部都是用二進位表示的,所以可連續用數n除2
代碼1:
<span style="font-size:14px;">#include <iostream>using namespace std;int main(void){ int n,m; m=0; cin>>n; while(n) { if(n%2) //如果n不能整除2,說明當前n的末尾數為1 m++; n>>=1; //n右移1位,即n/2 } cout<< m <<endl; return 0;}</span>
第二種:使用位操作
&:若a為1,且b為1,則a&b為1,否則,a&b為0
這裡初始化i=0x1;
n&i若為1,則n的末尾為1,否則為0
代碼2:
<span style="font-size:14px;">#include <iostream>using namespace std;int main(void){ // 使用位操作,1 和 二進位的最後一位進行 與(&) 運算 int n,i,m; m=0; i=0x1; cin>>n; while(n) { m+=(n&i); n>>=1; } cout << m <<endl; return 0;}</span>
第三種:使用另一種位操作
若n的二進位表示為0010 0000,則第二種演算法明顯有待改進
可讓n與n-1進行 & 運算,若n&(n-1)==0,則為上述情況(n的二進位表示中,只有一位是 0)。
代碼3:
<span style="font-size:14px;">#include <iostream>using namespace std;int main(void){ int n,m; m=0; cin>>n; while(n) { n&=(n-1); m++; } cout << m <<endl; return 0;}</span>