關於位運算

來自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

 

posted @ 2018-11-06 09:22  Salfi_Holmes  阅读(171)  评论(0编辑  收藏  举报