我在IAS程序集中实现了解决此问题的代码:
我有一个整数数组A=[a1,a2,...,an]
,我必须计算B=[|log2 a1|,|log2 a2|,...,|log2 an|]
,其中||
是向下舍入到最接近的整数的floor函数。
我尝试执行以下步骤:
|log2 x|
并验证它是否适用于正整数我写了这个,但它没有用:
loop: S(x)->Ac+ n ;load n in AC
Cc->S(x) log ;if AC >= 0 jump to log
halt ; else end the program
.empty
log: S(x)->R resm ;copy number 2 to AR
S(x)*R->A two ;multiply 2*2
At->S(x) resm ;save in resm
S(x)->Ah+ one ;+1 counter
At->S(x) cont ;save the counter
S(x)->Ac+ n ;load n in AC
S(x)->Ah- one;decrease n in 1
At->S(x) n ;save n
Cu->S(x) loop; jump to beggining to make all again
n: .data 4 ;number to calculate log
two: .data 2 ;base of the logarithm
one: .data 1 ;for increase the counter
resm: .data 2 ;for save the result of the multiplication
cont: .data 0 ;save the result of the logarithm
IAS是一种教学教学语言,在a simulator中实施。该页面还记录了指令集。
答案 0 :(得分:0)
由于指令集没有do this without looping的lzcnt / bsr类型的指令,通常的方法是计算移出所有位所需的右移位数。
floor(log2(x))
与查找最重要位的位置相同:
e.g。 floor(log2(17)) = floor(log2(16)) = 4
和floor(log2(15)) = 3
17和16都有5个二进制数字,但15只是0b1111
(4个二进制数字)。
由于log2(0)
是-Infinity,如果输入为零,则函数定义不明确。不幸的是,在这种情况下,即使x86's bsr
instruction也未定义结果。
我认为你试图通过将1
向左移动直到它大于或等于x
来进行循环,基于乘以two
。那可行。 (左移是乘以2)。
你的评论说的是2 * 2,这很奇怪。
我不知道IAS,你没有说明你的代码如何不起作用。所以问题的一部分仍然取决于你,直到你更新问题,询问任何具体的指令没有做你期望的事情或什么。