我是CS的新生,我发现找到二进制数的划分方式很痛苦。是否可以使用log快速查找24,例如,二进制?
答案 0 :(得分:5)
如果您想使用对数,可以。
将log 2 ( b )定义为log( b )/ log(2)或ln( b )/ ln(2)(它们是相同的)。
重复以下步骤:
将 n 定义为log 2 (b)的整数部分。 b 的二进制表示中的 n th 位置有1
。
设置 b = b - 2 n
重复第一步,直到 b = 0。
工作示例:将2835转换为二进制
log 2 (2835)= 11.47 .. => n = 11
二元表示在2 11 位置有一个1。
2835 - (2 11 = 2048)= 787
log 2 (787)= 9.62 ... => n = 9
二元表示在2 9 位置有一个1。
787 - (2 9 = 512)= 275
log 2 (275)= 8.10 ... => n = 8
二元表示在2 8 位置有1。
275 - (2 8 = 256)= 19
log 2 (19)= 4.25 ... => n = 4
二元表示在2 4 位置有一个1。
19 - (2 4 = 16)= 3
log 2 (3)= 1.58 .. => n = 1
二元表示在2 1 位置有1。
3 - (2 1 = 2)= 1
log 2 (1)= 0 => n = 0
二元表示在2 0 位置有1。
我们知道二元表示在{sup> 11 ,2 9 ,2 8 ,2 1 s > 4 ,2 1 和2 0 位置:
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
。
答案 1 :(得分:0)
是的,你必须循环0 - >比你需要的更大的力量,然后拿下余数并做同样的事情,这也很痛苦。
我建议你尝试一种叫做“分而治之”的分裂的递归方法。
http://web.stanford.edu/class/archive/cs/cs161/cs161.1138/lectures/05/Small05.pdf
但是,再次,因为你需要一个二进制表示,我想除非你使用ready utils,除法是最简单的恕我直言。
答案 2 :(得分:0)
从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.
这可能不是最优雅的方法,但是当你只是需要转换一些特别的想法时,比较和减法可能比分割更容易。