位运算学习笔记

为了初赛写的。。

与、或、异或、非

¬ 取反。

只有两个对应位都为 1 时才为 1

只要两个对应位中有一个 1 时就为 1

异或 ^ 只有两个对应位不同时才为 1

a ^ b ^ b=a

补码:在二进制表示下,正数和 0 的补码为其本身,负数的补码是将其对应正数按位取反后加一。

左移和右移

```num << i``` 表示将 $num$ 的二进制表示向左移动 $i$ 位所得的值。 ```num >> i``` 表示将 num 的二进制表示向右移动 i 位所得的值。

int mulPowerOfTwo(int n, int m) {  // 计算 n*(2^m)
  return n << m;
}
int divPowerOfTwo(int n, int m) {  // 计算 n/(2^m)
  return n >> m;
}

判断一个数是不是 2 的非负整数次幂

bool isPowerOfTwo(int n) { return n > 0 && (n & (n - 1)) == 0; }

对 2 的非负整数次幂取模

int modPowerOfTwo(int x, int mod) { return x & (mod - 1); }

判断符号是否相同

bool isSameSign(int x, int y) {  // 有 0 的情况例外
  return (x ^ y) >= 0;
}

获取一个数二进制的某一位

// 获取 a 的第 b 位,最低位编号为 0
int getBit(int a, int b) { return (a >> b) & 1; }

将一个数二进制的某一位设置为 0

// 将 a 的第 b 位设置为 0 ,最低位编号为 0
int unsetBit(int a, int b) { return a & ~(1 << b); }

将一个数二进制的某一位设置为 1

// 将 a 的第 b 位设置为 1 ,最低位编号为 0
int setBit(int a, int b) { return a | (1 << b); }

将一个数二进制的某一位取反

// 将 a 的第 b 位取反 ,最低位编号为 0
int flapBit(int a, int b) { return a ^ (1 << b); }

Zhang, Xuheng

这个人很懒,什么都没写

相关推荐

Leave a Reply

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

位运算学习笔记
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close