【问题标题】:how to convert decimal value to binary bits?如何将十进制值转换为二进制位?
【发布时间】:2019-01-23 15:24:45
【问题描述】:

基本上我想学习如何将十进制转换为二进制的算法,我发现了这个:

int convert(int dec)
{
    if (dec == 0)
    {
        return 0;
    }
    else
    {
        return (dec % 2 + 10 * convert(dec / 2));
    }
}

它工作得很好,但我无法理解dec % 2 + 10 * convert(dec / 2)。您能否将其转换为具有基本数学知识的人可以理解的方式?例如先执行什么方法,二进制dec = 50怎么变成110010

仅供参考:我可以这样做,这样:50=(2^5=32)+(2^4=16)+(2^1)=50

提前致谢。

【问题讨论】:

  • 这不是转换成二进制,而是转换成看起来像二进制的十进制。是的,它使用递归。
  • (ec) 注意这段代码。这段代码教给你一个非常混乱的、最终错误的教训。例如,此代码似乎将十进制数 5 转换为十进制数 101。这种看起来类似于十进制到二进制的转换,但实际上并非如此。
  • @SteveSummit 感谢您向我提供这方面的信息,您能否将我引导至适当的课程或计算机使用什么算法将十进制转换为二进制?
  • 对于一些示例输入(使用调试器或手动)遍历代码可能是最有意义的。
  • 可能不是 Is there a printf converter to print in binary format? 的副本,但有很多相关性。

标签: algorithm math binary decimal


【解决方案1】:

我不会为你实现它,但我很乐意描述算法并举一个例子。

从基数 10 转换为基数 b 最终遵循相同的一系列步骤,包括重复除以 b,然后保存余数。

50 (base10) 到 base2 的示例如下:

          Quotient  Remainder  
----------------------------
50 / 2 =  25        0
25 / 2 =  12        1
12 / 2 =   6        0
 6 / 2 =   3        0
 3 / 2 =   1        1 
 1 / 2 =   0        1

反向检查余数(从下到上)可以在基数 b(本例中为 2)中给出正确的表示:110010

如需了解为什么这行得通,请查看以下问题:https://math.stackexchange.com/questions/86207/converting-decimalbase-10-numbers-to-binary-by-repeatedly-dividing-by-2

【讨论】:

  • 谢谢你几乎回答了我的问题,只需要知道机器使用什么算法将 dec 转换为 bin 或反之亦然?
  • 机器不需要转换任何东西,它们存储二进制并使用二进制。
  • 注册为十进制#41 - 不是。它被注册为一个数字,如果表示为十进制,则看起来像41,或者如果表示为二进制,则看起来像101001,或者如果表示为十六进制,则看起来像0x29...跨度>
  • @aaaa 这似乎很苛刻,尤其是考虑到 EugeneSh 所说的一切都是正确的。我们在键盘上看到的字符被您的计算机视为数字。
  • @aaaa 也是,通常当您在互联网上寻求帮助时,不要对试图帮助您的人无礼,这是值得的
【解决方案2】:

让我们看看dec % 2 + 10 * convert(dec / 2)。第一部分dec % 2 是一个模运算,这决定了一个数字应该是 1 还是 0。其余部分,10 * convert(dec / 2) 找到下一个(以及下一个和下一个递归)数字并将其放在当前数字。

通过稍微修改代码,您可以很容易地看到发生了什么。将else 更改为:

else
{
    int ret = (dec % 2 + 10 * convert(dec / 2));
    printf("%d %d\n", dec, ret);
    return ret;
}

然后convert(50) 将打印这个:

$ ./a.out 
1 1
3 11
6 110
12 1100
25 11001
50 110010

但正如 cmets 中所指出的,这不是真正的基础转换。您已将数字 50 转换为一个完全不同的数字,看起来类似于二进制表示。

【讨论】:

    【解决方案3】:

    一种算法,将给定一个整数 N,生成一串字符 S,以二进制表示法表示 N。

    do
    {
        if N is odd
        {
            add '1' to the beginning of S
        }
        else
        {
            add '0' to the beginning of S
        }
        divide N by 2
    }
    while N is non-zero
    

    使用请求的示例:

    initially N=50 and S is empty
    50 is even: S="0"
    divide N by 2: N=25
    25 is odd: S="10"
    divide N by 2: N=12
    12 is even: S="010"
    divide N by 2: N=6
    6 is even: S="0010"
    divide N by 2: N=3
    3 is odd: S="10010"
    divide N by 2: N=1
    1 is odd: S="110010"
    divide N by 2: N=0
    stop looping
    

    【讨论】:

      猜你喜欢
      • 2012-01-06
      • 2013-12-26
      • 2017-07-15
      • 2018-06-24
      • 1970-01-01
      • 2019-09-09
      • 2018-10-20
      • 2014-10-29
      • 2011-02-17
      相关资源
      最近更新 更多