問題:請實現(xiàn)一個函數(shù)糕珊,輸入一個整數(shù),輸出該數(shù)二進制表示中1的個數(shù)振愿。例如把9表示成二進制是1001捷犹,有2位是1。因此輸入9冕末,函數(shù)返回2萍歉。
最初的想法就是對右側(cè)第一位檢查是否為1,然后利用n = n >> 1語句档桃,依次對第二位枪孩,...,第n位進行比對藻肄,代碼很簡單如下
int b1(int n)
{
int count = 0;
while(n){
if (n & 1) count++;
n = n >> 1;
}
return count;
}
然而很快問題便浮現(xiàn)了蔑舞,當你輸入一個負數(shù)時,程序?qū)⑾萑胨姥h(huán)仅炊,因為在不停的移位過程中n變成了0xffff斗幼;
書本上給出了本題的正確解法:
int b2(int n)
{
int count = 0;
while(n){
++ count;
n = (n-1)&n;
}
return count;
}
我則根據(jù)C語言中int類型大小為4個字節(jié)——即32位將第一個函數(shù)簡單修改成如下:
int b1_1(int n){
int count = 0,i;
for(i = 0; i < 32; i++){
if(n & 1) count++;
n = n >> 1;
}
return count;
}
在做一個簡單的測試函數(shù),利用時間函數(shù)生成了100個-1000~1000的隨機數(shù)進行測試抚垄,二者答案完全相同蜕窿。完整代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int b1_1(int n)
{
int count = 0;
while(n){
++ count;
n = (n-1)&n;
}
return count;
}
int b2(int n){
int count = 0,i;
for(i = 0; i < 32; i++){
if(n & 1) count++;
n = n >> 1;
}
return count;
}
int main(){
srand(time(0));
int i,r;
for(i = 0; i < 100; i++){
r = rand() % 2001 - 1000;
if(xxx(r) != yyy(r)){
printf("you are a liar谋逻!/n");
return 0;
}
}
printf("Congratulations!\n");
return 0;
}