【问题标题】:Is it possible to use logarithms to convert numbers to binary?是否可以使用对数将数字转换为二进制?
【发布时间】:2015-12-30 02:15:55
【问题描述】:

我是一名 CS 新生,我发现找到二进制数的除法方式很痛苦。是否可以使用 log 快速找到 24,例如二进制?

【问题讨论】:

  • 对数适用于数字——它们的基数无关紧要(例如log(1111b) = log(15) = log(0xF))。想想如何将任意数字转换为十进制。

标签: binary logarithm


【解决方案1】:

如果你想使用对数,你可以


定义 log2(b) 为 log(b) / log(2) 或 ln(b) / ln(2) (它们是相同的)。

重复以下操作:

  • n定义为log2(b)的整数部分。在b的二进制表示中的nth位置有一个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 中有1s 、21 和 20 个位置:

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
  • 我今天开始考虑将其作为一种更快的方式转换为二进制文件。发现您的回答很有帮助。很高兴看到我走在正确的轨道上。
【解决方案2】:

从 CS 的角度来看,二进制非常容易,因为您通常只需要达到 255。如果使用 HEX 表示法,则为 15。你用得越多,它就越容易。

我如何即时执行此操作,是记住所有 2 次幂,最高为 128,包括 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.

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

【讨论】:

    【解决方案3】:

    是的,你必须循环通过 0 -> 比你需要的更大的力量,然后取剩余的力量并做同样的事情,这也很痛苦。

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

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

    但同样,由于您需要二进制表示,我想除非您使用现成的工具,否则除法方法是最简单的恕我直言。

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 2017-09-11
      相关资源
      最近更新 更多