如何在ARM的二进制补码中找到整数的绝对值

Posted

技术标签:

【中文标题】如何在ARM的二进制补码中找到整数的绝对值【英文标题】:How to find the absolute value of an integer in Two's complement in ARM 【发布时间】:2018-11-15 01:59:20 【问题描述】:

如果我有 -2 (1111111111111111111111111111110),是否有一个简洁的 ARM 指令或一系列这样的指令可以使它成为 (00000000000000000000000000000010)。自从我失去第 30 位以来,OR 或 XOR 将无法正常工作。

谢谢

【问题讨论】:

ARM 的求反指令是rsb dst, src, #0(反向减法)。你可以tst/谓词-rsb。我认为这就是 C++ 编译器在内联/优化 std::abs 时会做的事情,但您应该尝试编译启用优化的 abs 函数。 哪个arm指令集?你看过NEG吗?您确实需要检查答案中所示的比较... 【参考方案1】:

要找到整数的绝对值,请使用比较和减法。

@ input in r0
cmp r0, #0          @ is r0 < 0?
rsbmi r0, r0 #0     @ if yes, r0 = 0 - r0

【讨论】:

mvn 按位非,反码反码而不是二进制补码。 infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/…。就像我评论的那样,你可以使用rsbmi r0, #0 @PeterCordes 显然你是对的。我认为mvn 代表“移动否定”。也就是说,你收到我的电子邮件了吗? 我知道了,谢谢提醒。我今天应该有时间看看。 @PeterCordes 我期待着你们的 cmets! 值得注意的是,如果您使用的是 ARMv7 或 ARMv8 设备,您将使用不包括条件执行非分支指令的 Thumb-2 指令集。在rsbmi 之前,您需要一个it mi。许多汇编程序会为您插入此内容,尽管有些汇编程序会发出警告,因为您收到了未明确请求的指令。见community.arm.com/processors/b/blog/posts/…

以上是关于如何在ARM的二进制补码中找到整数的绝对值的主要内容,如果未能解决你的问题,请参考以下文章

Java位移计算的简单了解

补码, 原码

整数的存储和运算

计算机数据表示

负数在计算机中的表示方法

原码反码补码相关内容以及Java语言中是以哪一种码表示的