具有 6 个寄存器的无符号整数的除法和模数
Division and modulo on unsigned integers with 6 registers
我必须找到使用最多 6 个寄存器(a、b、c、d、e、f)到 divide 两个无符号整数 N1 的对数时间算法(对于虚拟机)和 N2([两者都是 >=0] 正数或 0),其中如果 divider 为 0,则结果为 0 且 modulo 操作。
- div -> N1/N2
- mod -> N1 % N2
使用像
这样的命令
- 重置 a -> a =0
- 添加 a b -> a = a+b
- SUB a b -> a = max(0,a-b)
- SHR a -> a=floor(a/2)
- SHL a -> a=floor(a*2)
- INC a -> a+=1
- DEC a -> a=max(0,a-1)
- JUMP j -> 跳转到第 j 行
- JZERO x j -> 如果 x 为 0 则跳转到 k+j
- JODD x j -> 如果 x 是奇数则跳转到 k+j
有什么算法可以帮助我吗?
我只能检查 reg 中的值是奇数还是零。
感谢您的帮助。
Saturating-subtract 和 jzero
允许比较小于或等于(或大于),因此您可以在 How can I multiply and divide using only bit shifting and adding? 上实现 njuffa 答案的 C 版本,它产生商和余数。因为你有非饱和添加,你可以实现包装添加(然后通过检查环绕来进行手动进位检测,就像 Nathan 在 C 中所做的那样。)
jodd
允许您测试低位,如 if (x&1)
,这也可以让您实现标准的乘法算法。所以如果你有一个只给你商的除法算法,你可以用对数时间乘法来做remainder = dividend - quotient*divisor
。
其他二进制除法问答:
- How can I multiply and divide using only bit shifting and adding? - 关于同一个问答的另一个答案,这次在继续教科书长除法之前使用移位将除数的最高有效位与被除数“对齐”。但目前尚不清楚没有扩展宽度整数是否安全。
- Logarithmic time integer division using bit shift addition and subtraction only
- How can I use bit shifting to replace integer division?
- Divide by 10 using bit shifts? 在每一步都进行乘法运算,这仅在您具有快速乘法运算时才有用,或者对于设置了少量位的已知常量,因此只需要几个 shift/add。另一个优点是不需要右移,但您确实有右移。 (不同于一些玩具 ISA)
我必须找到使用最多 6 个寄存器(a、b、c、d、e、f)到 divide 两个无符号整数 N1 的对数时间算法(对于虚拟机)和 N2([两者都是 >=0] 正数或 0),其中如果 divider 为 0,则结果为 0 且 modulo 操作。
- div -> N1/N2
- mod -> N1 % N2
使用像
这样的命令- 重置 a -> a =0
- 添加 a b -> a = a+b
- SUB a b -> a = max(0,a-b)
- SHR a -> a=floor(a/2)
- SHL a -> a=floor(a*2)
- INC a -> a+=1
- DEC a -> a=max(0,a-1)
- JUMP j -> 跳转到第 j 行
- JZERO x j -> 如果 x 为 0 则跳转到 k+j
- JODD x j -> 如果 x 是奇数则跳转到 k+j
有什么算法可以帮助我吗?
我只能检查 reg 中的值是奇数还是零。
感谢您的帮助。
Saturating-subtract 和 jzero
允许比较小于或等于(或大于),因此您可以在 How can I multiply and divide using only bit shifting and adding? 上实现 njuffa 答案的 C 版本,它产生商和余数。因为你有非饱和添加,你可以实现包装添加(然后通过检查环绕来进行手动进位检测,就像 Nathan 在 C 中所做的那样。)
jodd
允许您测试低位,如 if (x&1)
,这也可以让您实现标准的乘法算法。所以如果你有一个只给你商的除法算法,你可以用对数时间乘法来做remainder = dividend - quotient*divisor
。
其他二进制除法问答:
- How can I multiply and divide using only bit shifting and adding? - 关于同一个问答的另一个答案,这次在继续教科书长除法之前使用移位将除数的最高有效位与被除数“对齐”。但目前尚不清楚没有扩展宽度整数是否安全。
- Logarithmic time integer division using bit shift addition and subtraction only
- How can I use bit shifting to replace integer division?
- Divide by 10 using bit shifts? 在每一步都进行乘法运算,这仅在您具有快速乘法运算时才有用,或者对于设置了少量位的已知常量,因此只需要几个 shift/add。另一个优点是不需要右移,但您确实有右移。 (不同于一些玩具 ISA)