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. 两整数之和】
-