zoukankan      html  css  js  c++  java
  • (转) 如何將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 }


    執行結果

    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 }


    執行結果

    8 = 00000000000000000000000000001000


    使用bitset後,cout出來就是2進位了。

    Conclusion
    另外一種寫法就是用%2搭配遞迴,不過既然bit寫法速度快又省記憶體,就沒多討論了。

    Reference
    Stephen Prata,C Primer Plus 5/e

    作者:tdyizhen1314(一位从事软硬件开发十年以上的老兵的故事,希望与大家一起交流,共同进步) 邮箱:495567686@qq.com
  • 相关阅读:
    线程基础1
    组合数学的卡特兰数 TOJ 3551: Game of Connections
    2017ACM/ICPC广西邀请赛-重现赛(感谢广西大学)
    Codeforces Round #430 (Div. 2)
    线代之高斯消元
    牛客网Wannafly模拟赛
    TOJ3039: 材质贴图
    AtCoder Grand Contest 019
    TOJ 3974: Region n条直线m个圆最多将圆分为几个区域
    AIM Tech Round 4 (Div. 2)
  • 原文地址:https://www.cnblogs.com/tdyizhen1314/p/2430801.html
Copyright © 2011-2022 走看看