問題:寫乙個函式返回引數二進位制中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 ...