我是一名计算机系新生,对于通过除二法找到二进制数的方式感到很麻烦。例如,是否可以使用对数来快速找到24的二进制表示形式?
将n定义为log2(b)的整数部分。在b的二进制表示的第n位上有一个1。
设置b = b - 2n
重复第一步,直到 b = 0。
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
101100010011
。11000b
。 - Wai Ha Lee从计算机科学的角度来看,二进制很容易,因为通常只需要使用到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到比你需要的幂更大的范围,然后取余数并重复相同的过程,这也很麻烦。
我建议你尝试递归方法的除法,称为“分而治之”。
http://web.stanford.edu/class/archive/cs/cs161/cs161.1138/lectures/05/Small05.pdf
但是,由于您需要二进制表示,我认为除非您使用准备好的工具,否则除法方法是最简单的方法。
log(1111b)
=log(15)
=log(0xF)
)。考虑如何将任意数字转换为十进制。 - Wai Ha Lee