- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试用汇编语言生成一个高效的扩展乘法。尽管我的代码运行良好,但我对带符号的乘法有一些疑问。目前,我的数字是基于二次补码的方法,我将我的数字转换为正数进行乘法,然后调整最终大小。它工作但有点虚拟,因为它需要额外的副本。我打开了一本硬件书籍,发现了对有符号数运行良好的移位加法乘法器。
因此,考虑到我使用 4 位数字作为输入,我得到了 8 位数字作为输出。我想用左移二进制乘法器进行乘法运算 -3 * 3,我有:
1101 // -3
X 0011 // 3
-----------------------
11111101 // I make the first x with sign extension
1111101 // I make the a second x with sign extension,
000000 // 0 no sign extension
00000 // Later I will subtract this in case "of", as in book
-----------------------
11110111 <----------- final addition I get -9 OK it works
现在让我们使用教科书算法寻求混合解决方案,我分解我的第一个数字1101 到 11 和 01,0011 到 00 和 11 也是如此。如果我重写我的算法,就像我们在学校学到的那样:
11 01
00 11
---------------
00 11 (unsigned mul 01 x 11 gives 00 11) , no sign extension
10 01 (11 * 11 gives 10 01)
--------------------
10 01 11 (sum)
11 10 01 11 (I made a sign extension until 8 bit)
00 00 00 00 (the last multiplication only 0)
-----------------------
11 10 01 11 (final sum)
结论11110111 != 11100111,我输了一点。
那么,pb 在哪里?
最好的。
最佳答案
你在做一些奇怪的事情。
有几种常用的有符号整数相乘的方法:
如您所述,可以先将两个被乘数的绝对值相乘,然后如果预期乘积为负,则取反。
使用无符号乘法将整数相乘,然后如果一个被乘数为负,则从乘积的最高有效部分减去另一个(然后对称地重复相同的操作,检查另一个被乘数是否小于 0等)。
您使用 Booth's algorithm .
关于algorithm - 混合左加乘法器,用于有符号乘法的教科书算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946756/
这个问题在这里已经有了答案: Convert int to double (3 个答案) 关闭 4 年前。 我正在根据课文学习 C。作者提供的示例代码是: #include main() { in
我正在为一个学校项目实现 RSA 密码系统。我在 Linux 上用 C 语言做这个项目,我使用 GNU MP 库进行大部分数学运算。 出于某种原因,对于具有相同消息的不同公钥,我总是得到相同的密文,所
int x = random(); int y = random(); unsigned ux = (unsigned) x; unsigned uy = (unsigned) y; 对于以下每个 C
int x = random(); int y = random(); unsigned ux = (unsigned) x; unsigned uy = (unsigned) y; 对于以下每个 C
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我是一名优秀的程序员,十分优秀!