c++ - 使用按位运算符和 bool 逻辑的绝对值 abs(x)

标签 c++ c bit-manipulation language-lawyer absolute-value

这个问题在这里已经有了答案:





How to compute the integer absolute value

(11 个回答)


去年关闭。




这是如何运作的?

这个想法是让abs(x)对整数使用按位运算符(假设为 32 位字):

y = x >> 31
(x + y) ^ y // This gives abs(x) (is ^ XOR)?

最佳答案

假设 32 位字,如问题所述:

对于负 x , x >> 31在 C 和 C++ 标准中是实现定义的。代码的作者期望整数的补码和算术右移,其中 x >> 31如果 x 的符号位产生全零位如果符号位为 1,则为零且全为 1。

因此,如果 x为正数或零,y为零,并且 x + yx , 所以 (x + y) ^ yx ,即 x 的绝对值.

x为负,y全为 1,表示为 2 的补码中的 -1。然后x + yx - 1 .然后与所有 1 进行异或将所有位反转。将所有位取反相当于取二的补码减一,二的补码是用来取反二进制补码格式的整数的方法。换句话说,异或运算 q所有的给 -q - 1 .所以x - 1与所有的异或产生 -(x - 1) - 1 = -x + 1 - 1 = -x ,即 x 的绝对值除非 x是格式的最小可能值(-2,147,483,648 表示 32 位二进制补码),在这种情况下,绝对值 (2,147,483,648) 太大而无法表示,结果位模式只是原始 x .

关于c++ - 使用按位运算符和 bool 逻辑的绝对值 abs(x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60601908/

相关文章:

c - 如何在c中查找字符串在csv文件中的哪一行

c++ - 如何绕过转换 const char* 到 int

c++ - 棘手的子串问题

C:使用指向具有固定字符数的数组的指针进行动态内存分配

C:获取某个字符前的子串

java - 有效地从 byte[] 数组中提取任意长度的位序列

c++ - 设置和重置部分位图

java - Bitwise AND, Bitwise Inclusive OR 问题,在 Java 中

C++ lambda 参数列表

c++ - 即使基类和派生类只使用原始数据类型,我是否需要定义一个虚拟析构函数?