(转) 如何將10進位轉2進位? (C/C++) (C)
Abstract
printf()只能顯示10、8、16進位的值,卻無法顯示2進位的值,但有時候我們會希望能直接顯示2進位數字。
Introduction
使用環境:Visual C++ 8.0 / Visual Studio 2005
Method 1:
這是從C Primer Plus 5/e改寫的,使用bit運算來將10進位轉2進位,相當漂亮的寫法。
decimal2binary.c / C
1 /*
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : decimal2binary.c
5 Compiler : Visual C++ 8.0
6 Description : Demo how to convert deciaml to binary by C
7 Release : 07/22/2008 1.0
8 */
9 #include <stdio.h>
10
11 char* itobs(int n, char *ps) {
12 int size = 8 * sizeof(n);
13 int i = size -1;
14
15 while(i+1) {
16 ps[i--] = (1 & n) + '0';
17 n >>= 1;
18 }
19
20 ps[size] = '\0';
21 return ps;
22 }
23
24 int main() {
25 int n = 8;
26 char s[8 * sizeof(n) + 1];
27
28 printf("%d = %s\n", n, itobs(n,s));
29 }
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : decimal2binary.c
5 Compiler : Visual C++ 8.0
6 Description : Demo how to convert deciaml to binary by C
7 Release : 07/22/2008 1.0
8 */
9 #include <stdio.h>
10
11 char* itobs(int n, char *ps) {
12 int size = 8 * sizeof(n);
13 int i = size -1;
14
15 while(i+1) {
16 ps[i--] = (1 & n) + '0';
17 n >>= 1;
18 }
19
20 ps[size] = '\0';
21 return ps;
22 }
23
24 int main() {
25 int n = 8;
26 char s[8 * sizeof(n) + 1];
27
28 printf("%d = %s\n", n, itobs(n,s));
29 }
執行結果
8 = 00000000000000000000000000001000
16行
ps[i--] = (1 & n) + '0';
對n做mask,將第0 bit取出來,這樣的寫法比%2快,因為取出是個int,所以透過 + '0'轉成char,存入字串陣列。
17行
n >>= 1;
0 bit處理完,處理1 bit...以此類推。
15行
while(i+1) {
相當於while(i >=0)
20行
ps[size] = '\0';
將字串收尾。
Method 2:
若能用C++,就有很簡單的解法。
decimal2binary.cpp / C++
1 /*
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : decimal2binary.cpp
5 Compiler : Visual C++ 8.0
6 Description : Demo how to convert deciaml to binary by C++
7 Release : 07/22/2008 1.0
8 */
9 #include <iostream>
10 #include <bitset>
11
12 using namespace std;
13
14 int main() {
15 int n = 8;
16 bitset<sizeof(n) * 8> s(n);
17
18 cout << n << " = " << s << endl;
19 }
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : decimal2binary.cpp
5 Compiler : Visual C++ 8.0
6 Description : Demo how to convert deciaml to binary by C++
7 Release : 07/22/2008 1.0
8 */
9 #include <iostream>
10 #include <bitset>
11
12 using namespace std;
13
14 int main() {
15 int n = 8;
16 bitset<sizeof(n) * 8> s(n);
17
18 cout << n << " = " << s << endl;
19 }
執行結果
8 = 00000000000000000000000000001000
使用bitset後,cout出來就是2進位了。
Conclusion
另外一種寫法就是用%2搭配遞迴,不過既然bit寫法速度快又省記憶體,就沒多討論了。
Reference
Stephen Prata,C Primer Plus 5/e
作者:tdyizhen1314(一位从事软硬件开发十年以上的老兵的故事,希望与大家一起交流,共同进步)
邮箱:495567585@qq.com
posted on 2012-04-03 11:40 tdyizhen1314 阅读(417) 评论(0) 编辑 收藏 举报