寫乙個函式返回引數二進位制中1的個數

2021-08-16 04:46:23 字數 1181 閱讀 9585

問題:寫乙個函式返回引數二進位制中1的個數。例如:10的二進位制位為00000000 00000000 00000000 00001010 ,其中1的個數有2個。

解法一:10的二進位制:1010    5的二進位制:0101      2的二進位制:0010    1的二進位制:0001     0的二進位制:0000

value/2 相當於右移一位,當value==0時,跳出迴圈。當value%2 == 1時,說明最低位為1,不斷右移,測試最低位是不是1,是1就count++,知道統計完所有的1。計算機是以補碼儲存,正數的補碼和原碼相同,負數的補碼是其原碼取反+1,統計正數的時候結果正確,由於負數%2 不會有等於1,所有統計負數的時候會出錯。

int count_one_bits(unsigned int value)

printf("count = %d\n",count);

return count;

}

解法二:例:10的二進位制:1010   1的二進位制:0001     1010 & 0001 = 0000(說明10的二進位制的最低位為0)

0111&0001=0001(最低位為1) ,任何數和1按位與,可以檢測該數最低位的bit位是不是1。乙個整型有32個位元位,和1按位與再右移,就可以統計出所有的1。以下**等價於

while(value != 0)

int count_one_bits(unsigned int value)

printf("count = %d\n",count);

return count;

}

解法三:更高效的一種演算法。

}執行結果:

寫乙個函式返回引數二進位制中1的個數

寫乙個函式返回引數二進位制中1的個數 分析 1 輸入乙個數 2 判斷它是否為0。3 如果不為0,就對它進行模2取餘,模2的過程就相當於把這個數向右移除了一位,如果餘數為1,則證明移除的這一位為1,就將其記錄下來。如果餘數為0,就證明移除的這一位為0,就不記錄。4 經過第3步以後,對這個數進行除2取整...

寫乙個函式返回引數二進位制中1的個數

寫乙個函式返回引數二進位制中1的個數 15 00001111 方法一 include include int main printf d n count system pause return0 此方法不能計算 0 的情況 2.方法二 include include int main printf ...

寫乙個函式返回引數二進位制中 1 的個數

方法一 注意 1 這種方法是採取按位於,即讓索要判斷的數和1 與,可以判斷最後一位是0還是1,然後每判斷一次 向右移動一位再判斷下一位,以此類推迴圈32次,即可知道這個數的每一位情況 include int main num num 1 沒判斷完一位,這個數向右移動1位,再判斷下一位 printf ...