4.4 应用 n + (~n) = -1
原理
设整数 n 类型为 int_8,值为 3,则 3 + (~3) = 0000 0011 + 1111 1100 = 1111 1111 = -1,所以引出非运算的基础公式 n + (~n) = -1,也可以将 n ^ -1 = ~n 带入。
位运算实现n+1与n-1
对n + (~n) = -1进行等式变换可得:
int n;
~n = -(n + 1);
n + 1 = -~n;
n - 1 = ~-n; // 假设n = -n,可推出此等式
取相反数
一个数的相反数等于其按位取反后再加1,对上等式变换推出:
int n;
-n = ~n + 1;
取绝对值
这一块内容也用到了n ^ 0 = n 和 n ^ -1 = ~n:
- 若 n 为非负数,则 n » 31 = 0,所以 abs = n ^ 0 - 0 = n。
- 若 n 为负数,则 n » 31 = -1,所以 abs = n ^ (-1) + 1 = ~n + 1 = -1 - n + 1 = -n。
int abs, n;
abs = (n ^ (n >> 31)) - (n >> 31)