3

我想真正的问题是如何将base2/binary 转换为base10。最常见的应用可能是创建输出字符串:将一大块二进制数字数据转换为字符数组。这究竟是如何完成的?

我的猜测: 看到可能没有为每个数值预定义一个字符串,我猜测计算机从右到左遍历整数的每一位,每次递增 char 数组/base10 表示法中的适当值地方。如果我们取二进制数 160(10100000),它会知道第 8 位的 1 表示 128,因此它将 1 放入第三列,将 2 放入第二列,将 8 放入第三列。第 6 列中的 1 表示 32,它会将这些值添加到第二和第一位置,如果需要,可以继续。在此之后,它很容易转换为实际的字符代码。

4

4 回答 4

2
while number != 0:
    nextdigit = number % 10
    AddToLeft(result, convert nextdigit to char)
    number = number / 10

留给读者处理零和负数的练习。

于 2010-03-23T23:10:48.070 回答
1

如何完成取决于平台。例如,Intel 类型的处理器内置了对打包 BCD(二进制编码十进制)算术的支持。

假设寄存器al包含二进制 00101010,十进制 42。

fushf ;store flags on the stack
std ;set decimal flag
sub bl, bl ;clear bl register
add bl, al ;add al to bl using BCD arithmetics
pop ;restore flags from stack

寄存器现在bl包含 01000010。

高四位包含 0100,即十进制 4。
低四位包含 0010,即十进制 2。

要将其转换为字符,请从寄存器中提取四位值并添加 48 以获得数字的字符代码。

于 2010-03-23T23:51:46.077 回答
1

Linux 内核中的实现printf非常易读。请参阅lib/vsprintf.c:nu​​mber()

嗯,好吧,主要是可读性强。 do_div是一个带有汇编程序的宏。

于 2010-03-24T00:02:03.900 回答
-1

首先,这是一个棘手的问题,因为它显然是基于平台和语言的。

以 Java 为例。声明为 int 的整数实际上是 32 位长。

所以要表示 0 的十进制值,我们应该有

1000000000000000000000000000000 <== 前导 1(或零?)表示它是否为正。

嗯,这是因为 Java 将 int 值存储为半负半正......

所以,我的猜测是Java会做以下事情:

step1 : 从变量或文字的“指针”指向的一块 32 位内存中获取内容

step2 : 计算其十进制值,将大数转换为 0

step3 : (jdk5+) 使用 Int32.toString() 将字符串文字返回为“0”

这可能是错误的,因为我从未想过这样的问题。

我真的不认为任何语言会尝试将值转换为字符数组,因为添加的开销很大......

或者,根据我的数学经验,要将二进制值转换为十进制,您将根据值进行计算,而不是其文字表示:

    1    1  0  1  in binary

    1*2^3 + 1* 2^2 + 0*2^1 +1*2^0 = 13 in decimal     
于 2010-03-23T23:11:53.617 回答