來自https://www.luogu.org/blog/chengni5673/er-jin-zhi-yu-wei-yun-suan 轉侵刪
一··左移<< 右移>>
“将一个二进制数向左或向右移动 k 位,就是给一个数乘 2^k 或者除 2^k(末尾1不计)。”
二·取反~
“对于 int 来说, ~ x=-x-1”
三·與and &
“对于两个二进制数的每一位,如果这一位都是 1 ,那么这一位为 1 ,否则这一位为 0。”
if(x&1) 那麼x是奇數
四·或or |
“如果这两个数此位有一个 1 那么此位就是 1,否则为0。
- x & y<=x
- x | y>=x”
五·異或xor ^
“对于两个二进制数的每一位,如果相同则为 0 ,否则为 1。
显而易见的是一个数异或他自己肯定是得 0 的
对于一个形如 2*n 的数 x, x ^ 1 =x+1,而对于一个形如 2*n+1 的数 x, x ^ 1 =x-1
如果 x ^ y=z 那么 y ^ z=x, x ^ z=y”
"关于位运算的优先级,大致按下面排序
加减运算 >> 移位运算 >> 比较大小运算 >> 与运算 >> 异或运算 >> 或运算"
優化:
交換兩個整數: x=x^y, y=y^x, x=x^y