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)