通过 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