是否可以使用对数将数字转换为二进制?
Is it possible to use logarithms to convert numbers to binary?
我是一名 CS 新生,我发现寻找二进制数的除法方式很痛苦。是否可以使用log快速找到24,例如二进制?
是的,你必须循环遍历 0 -> 大于你需要的幂,然后取余数并做同样的事情,这也很痛苦。
我建议您尝试称为 'Divide and Conquer' 的除法递归方法。
http://web.stanford.edu/class/archive/cs/cs161/cs161.1138/lectures/05/Small05.pdf
但同样,由于您需要二进制表示,我想除非您使用现成的实用程序,除法方法是最简单的恕我直言。
从 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.
这可能不是最优雅的方法,但是当您只是需要临时转换一些东西时,将其视为比较和减法可能比除法更容易。
如果你想使用对数,你可以。
定义 log2(b) 为 log(b) / log(2 ) 或 ln(b) / ln(2) (它们相同)。
重复以下内容:
定义n作为log2(b)的整数部分。在bnth位置有一个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、2[=88=中有1
s ]8、24、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
.
我是一名 CS 新生,我发现寻找二进制数的除法方式很痛苦。是否可以使用log快速找到24,例如二进制?
是的,你必须循环遍历 0 -> 大于你需要的幂,然后取余数并做同样的事情,这也很痛苦。
我建议您尝试称为 'Divide and Conquer' 的除法递归方法。
http://web.stanford.edu/class/archive/cs/cs161/cs161.1138/lectures/05/Small05.pdf
但同样,由于您需要二进制表示,我想除非您使用现成的实用程序,除法方法是最简单的恕我直言。
从 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.
这可能不是最优雅的方法,但是当您只是需要临时转换一些东西时,将其视为比较和减法可能比除法更容易。
如果你想使用对数,你可以。
定义 log2(b) 为 log(b) / log(2 ) 或 ln(b) / ln(2) (它们相同)。
重复以下内容:
定义n作为log2(b)的整数部分。在bnth位置有一个
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、2[=88=中有1
s ]8、24、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
.