有可能使用对数将数字转换为二进制吗?



我是一名计算机科学新生,我发现找到二进制数的除法是一种痛苦。是否有可能使用log来快速找到24,例如,二进制文件?

如果想使用对数,可以


2

定义日志<子> ( b ),日志(b )/日志(2)或ln (b )/ln(2)(它们是相同的)。

重复以下内容:

  • 定义n为log2(b)的整数部分。在b的二进制表示中,n位置有一个1

  • <设置em> = b - 2 <一口> n

  • 重复第一步直到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 s:

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

从CS的角度来看,二进制非常简单,因为通常只需要到255。如果使用HEX表示法,则为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 ->次方,这比你需要的大,然后取剩余的,做同样的事情,这也是一个痛苦的

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

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

但是,由于您需要二进制表示,我想除非您使用ready utils,否则除法方法是最简单的方法。

最新更新