通过 Bit-Manipulation 实现 abs 函数
# 题意
实现函数 int abs(int x)
,当
# 代码
先说结论:
int abs(int x) {
return (x >> 31 ^ x) - (x >> 31);
}
// Make sure to add code blocks to your code group
# 分析
首先我们要知道如果通过位运算来得到一个数的相反数。我们可以通过 ~x + 1
,即对一个数取反加一就能得到该数的相反数,这是因为 ~x + x = 0b11111...
,而 0b11111...
就是二进制补码下的 -1
,我们再加 1
,就能得到 0
了。因此 (~x + 1) + x = 0
,即 ~x + 1
是 x
的相反数。
我们对答案 (x >> 31 ^ x) - (x >> 31)
进行分析:
当 signed int
,会进行算术右移,所以 x >> 31
会得到 0b11111...
,即 -1
, 很容易发现,此时 -1 ^ x
就相当于对每一个二进制位进行取反。而后面的 - (x >> 31)
很容易看出就是 + 1
,整体就是 return ~x + 1;
当 x >> 31
会得到 0b00000...
,此时进行异或操作后得到的结果还是 x
,而后面则是个 - 0
,整体就是 return x - 0;
综上,我们便可以通过位运算实现 abs 函数了。
Last Updated: 9/21/2023, 10:59:25 PM