划分二进制数的算法,运行时间为O(logn)

时间:2016-10-24 10:41:45

标签: binary division

我需要用简单的汇编语言(而不是汇编语法)编写一个程序来计算两个二进制数16位的除法而没有O(logn)中的提醒,我想知道是否有一个有效的算法来做它

如果在网上找到了一些算法,但所有这些算法都在寻找对数字中特定位的访问权限,而我无法做到这一点。

我所拥有的唯一算术运算是+, - ,向右/向左移动但只有每个操作,&,|,!这显然都是......

谢谢,

Eliav的

1 个答案:

答案 0 :(得分:0)

这应该有效。 它对你有帮助吗?

C-风格:

c=1;
// find the maximum n for b*2^n <= a
// c=2^n
while((b << 1) <= a) {
    b = b << 1;
    c = c << 1;
}
while (c > 0) {
    if (a - b >= 0) {
        a -= b;
        result += c;
    }
    c = c >> 1;
    b = b >> 1;
}

汇编风格:

registers s0,s1,s2,s3, zero
syntax <instr.> <dest>,<src>,<arg>

%result: s0
%a: s1
%b: s2
%c: s3

add, s3, zero, 1



loop_1_start:
left_shift s4,s2,1
jump_if_greater s4,s1,loop_1_end

left_shift s2,s2,1
left_shift s3,s3,1

jump loop_1_start
loop_1_end:

loop_2_start:
jump_if_greate_or_equal s3,zero,loop_2_end

if_start:
sub s4,s1,s2
jump_if_smaller s4, zero, if_end
sub s1,s1,s2
add s0,s0,s3
if_end:


right_shift s2,s2,1
right_shift s3,s3,1

jump loop_2_start
loop_2_end: