位运算常用操作
计算机中存储数字,是存储数字的补码,其中正数的补码是它本身,负数的补码是原码取反再加一。
计算机没有减法操作,所以 x + (-x) = 0,所以 -x = 0 - x,计算机中计算二进制0 - x,一样需要借位,计算的结果就是 ~x + 1,所以计算机存负数存的是 ~x + 1。
求x的第k位,k表示的是下标
x >> k & 1
lowbit,lowbit表示一个二进制中从右往左数,第一个1及其后面的数字。比如 lowbit(1101100) = 100
x & -x
x & -x = x & (~x + 1) 得益于补码的运算是从右往左数第一个1,该1以后的值不变,该1以前的数字全部取反,所以x & (~x + 1)以后,第一个1及其以后的数字都保存了下来。
求a的绝对值
mask = a >> 63;
res = mask ^ a - mask;