使用对数将数字转换为二进制是否可行?

3

我是一名计算机系新生,对于通过除二法找到二进制数的方式感到很麻烦。例如,是否可以使用对数来快速找到24的二进制表示形式?


对数适用于数字 - 它们所写的基数是无关紧要的(例如,log(1111b) = log(15) = log(0xF))。考虑如何将任意数字转换为十进制。 - Wai Ha Lee
3个回答

9
如果你想使用对数,是可以的。
将log2(b)定义为log(b) / log(2) 或者 ln(b) / ln(2)(它们相同)。
重复以下步骤:
  • 将n定义为log2(b)的整数部分。在b的二进制表示的第n位上有一个1。

  • 设置b = b - 2n

  • 重复第一步,直到 b = 0。


示例:将2835转换为二进制的方法
  • log2(2835) = 11.47.. => n = 11

    二进制表示在第211位为1。

  • 2835 - (211 = 2048) = 787

    log2(787) = 9.62... => n = 9

    二进制表示在第29位为1。

  • 787 - (29 = 512) = 275

    log2(275) = 8.10... => n = 8

    二进制表示在第28位为1。

  • 275 - (28 = 256) = 19

    log2(19) = 4.25... => n = 4

    二进制表示在第24位为1。

  • 19 - (24 = 16) = 3

    log2(3) = 1.58.. => n = 1

    二进制表示在第21位为1。

  • 3 - (21 = 2) = 1

    log2(1) = 0 => n = 0

    二进制表示在第20位为1。

我们知道二进制表示在211、29、28、24、21和20位置上有1:

2^     11 10 9 8 7 6 5 4 3 2 1 0
binary  1  0 1 1 0 0 0 1 0 0 1 1

所以,2835的二进制表示是101100010011

我重新阅读了你的问题,发现你想要24的二进制表示。使用同样的原则,你可以得到2的4次方和2的3次方,从而得到24 = 11000b - Wai Ha Lee
1
今天我开始思考一种更快的转换为二进制的方法,发现你的答案非常有帮助。很高兴看到我走在了正确的道路上。 - richbai90
干得好,这是我所知道的最佳方式。 - JohnP2

1

从计算机科学的角度来看,二进制很容易,因为通常只需要使用到255。如果使用十六进制表示,则只需使用到15。你使用得越多,就会变得越容易。

我如何在运行时进行转换,是通过记住所有小于等于128的2次幂,包括1。(1的存在而不是1.4xxx可能意味着你不能使用对数)。

128,64,32,16,8,4,2,1

然后我使用的规则是,如果数字大于降序的每个幂,则为'1'并将其减去,否则为'0'。

所以163

163 >= 128 = '1' R 35
35  !>= 64 = '0'
35  >= 32  = '1' R 3
3   !>= 16 = '0'
3   !>= 8  = '0'
3   !>= 4  = '0'
3   >=  2  = '1' R 1
1   >=  1  = '1' R 0

163 = 10100011.

可能不是最优雅的方法,但当您只需要临时转换某些内容时,将其视为比较和减法可能比除法更容易。


0

是的,你必须循环遍历从0到比你需要的幂更大的范围,然后取余数并重复相同的过程,这也很麻烦。

我建议你尝试递归方法的除法,称为“分而治之”。

http://web.stanford.edu/class/archive/cs/cs161/cs161.1138/lectures/05/Small05.pdf

但是,由于您需要二进制表示,我认为除非您使用准备好的工具,否则除法方法是最简单的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接