7. 位运算 0️⃣1️⃣
运算符和优先级
优先级从高到低:
- 按位取反(
~) - 左移(
<<)、有符号右移(>>) - 按位与(
&)、按位或(|)、按位异或(^)
常用操作
位运算的累加:ans = ans | X;,通常 ans 起始为 0, X 是计算后的结果。
位运算的遍历:右移 nn = n >> 1;并不断取 n 的最后一个数位n & 1。
检查最后一位是否为 1:n & 1。
检查第 i 位是否为 1: n & (1 << i)。
改变某一位所在的位置(通常是 1):1 << X,把 1 移动到从右到左的第 X 位。
把 n 的二进制最低位的 1 变为 0: n & (n - 1)。
常用函数和常数
统计 1 的个数:__builtin_popcount(x ^ y)
翻转数组时使用的掩码:
const uint32_t M1 = 0x55555555; // 01010101010101010101010101010101
const uint32_t M2 = 0x33333333; // 00110011001100110011001100110011
const uint32_t M4 = 0x0f0f0f0f; // 00001111000011110000111100001111
const uint32_t M8 = 0x00ff00ff; // 00000000111111110000000011111111
const uint32_t M16 = 0x0000ffff; // 00000000000000001111111111111111
位运算题目
【136.只出现一次的数字】
【371. 两整数之和】
-