】通過c語言程式將
十進位制數轉化成二進位制數,然後求出二進位制數中1的個數。
下面用三種方法來實現
。來方法一:除2取餘法。對一十進位制數,用2輾轉相除至結果為1,將餘數和最後的1從下向上倒序寫就是對應的二進位制。
例如:十進位制數302轉化成二進位制。
302/2=151餘0;151/2=75餘1;75/2=37餘1;37/2=18餘1;18/2=9餘0;9/2=4餘1;4/2=2餘0;2/2=1餘0,故二進位制為100101110。(二進位制中首位是符號位,正數加1,負數加0)
此方法的缺點是只可以對正數運算,一旦輸入負數結果出現錯誤。
**如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include
int
main()
printf
(
"count=%d"
,count);
return
0;
}
方法二:移位法。移位法分為左移和右移兩種情況,左移時數的右邊都補0;右移時正數左邊補0,負數左邊補1。c語言中「<<」為左移運算子,「>>」為右移運算子。移位法雖可以正負數進行轉換,但它的缺點是效率低下,對於-1這個數需要向右移位32次才能找到對應的二進位制數。下面程式用了「右移法」實現十進位製到二進位制的轉換。
**如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include
int
main()
printf
(
"count=%d"
,count);
return
0;
}
方法三:按位「與」法,即x=x&(x-1)。此方法不僅可以對正負數進行十進位製到二進位制的轉化,而且效率高。對於整型數在存放位址時,它以32位或64位的補碼形式存放。x=x&(x-1)還可以判斷某數是否為2的n次方,當結果為0時,則這個數就是2的n次方。
下面對十進位制數15進行轉換分析:
15的八位二進位制數補碼為0000 1111.
第一次與運算 x 0000 1111
x-1 0000 1110
x&(x-1) 0000 1110---14
第二次與運算 x 0000 1110
x-1 0000 1101
x&(x-1) 0000 1100---12
第三次與運算 x 0000 1100
x-1 0000 1011
x&(x-1) 0000 1000---8
第四次與運算 x 0000 1000
x-1 0000 0111
x&(x-1) 0000 0000---0
進行4次與運算後結果為0,則二進位制中1的個數就為4。
**如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include
int
main()
printf
(
"count=%d"
,count);
return
0;
}
要理解這篇文章最主要的就是要掌握
& 按位與, | 按位或 , ^ 按位異或
1 & 1 = 1, 1 | 1 = 1, 1 ^ 1 = 0
1 & 0 = 0, 1 | 0 = 1, 1 ^ 0 = 1
0 & 1 = 0, 0 | 1 = 1, 0 ^ 1 = 1
0 & 0 = 0, 0 | 0 = 0, 0 ^ 0 = 0
寫乙個函式返回引數二進位制中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 ...