我认为真正的问题是如何将base2 / binary转换为base10。最常见的应用可能是为输出创建字符串:将一大块二进制数值数据转换为字符数组。究竟是怎么做到的?
我猜: 看到可能没有为每个数值预定义字符串,我猜测计算机从右到左遍历整数的每个位,每次都在char数组/ base10表示法中增加适当的值。如果我们以二进制(10100000)取数字160,它将知道第8位的1表示128,所以它将1放入第3列,2放在第二列,8放在第三列。第6列中的1表示32,它会将这些值添加到第二个和第一个位置,如果需要的话可以继续。在此之后,它可以轻松转换为实际的字符代码。
答案 0 :(得分:2)
while number != 0:
nextdigit = number % 10
AddToLeft(result, convert nextdigit to char)
number = number / 10
这是留给读者处理零和负数的练习。
答案 1 :(得分:1)
如何完成取决于平台。例如,英特尔类型处理器内置支持打包的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。
要将其转换为字符,请从寄存器中提取4位值,然后添加48以获取数字的字符代码。
答案 2 :(得分:1)
Linux内核中printf
的实现非常易读。请参阅lib/vsprintf.c:number()。
好吧,好吧,大部分都很可读。 do_div
是一个包含汇编程序的宏。
答案 3 :(得分:-1)
首先,这是一个棘手的问题,因为它显然是基于平台和语言。
以Java为例。声明为int的整数实际上是32位长。
所以要表示小数值0,我们应该
1000000000000000000000000000000< ==前导1(或零?)表示它是否为正。
嗯,这是因为Java存储int值为half negative和half positive ...
所以,我的猜测是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