习题AcWing216,P2114,例题P4310,K2192(最大and值),P8019
0x01 位运算
位运算和按位贪心是常用的计算和优化手段。其中,按位枚举可以将线性级别的枚举优化至 log \log log 级别;由于二进制的独特性质 2 0 + 2 1 + ⋯ + 2 k − 1 < 2 k 2^0+2^1+\cdots+2^{k-1}<2^k 20+21+⋯+2k−1<2k,也让从高位到低位的按位贪心成为了可能。本文接下来将介绍一系列的位运算基本技巧,并结合例题分析位运算优化的运用。
位运算技巧
位运算的基本运算符为:&, |, ^, <<, >>, ~
,分别表示按位与、或、异或、左移,右移,取反。需要注意的是,由于位运算的优先级较低,运算时最好加上括号。
假设二进制位的最低位为第 0 0 0 位,当前的数为 x x x,则
- 将 x x x 左移,右移一位:
x << 1
,x >> 1
; - 将 x x x 最后一位变为 1 , 0 1,0 1,0:
x | 1
,(x|1) - 1
; - 将 x x x 二进制第 k k k 位变为 1 , 0 1,0 1,0:
x | (1 << k)
,x (& ~(1 << k))
; - 将 x x x 二进制后 k k k 位变为 1 , 0 1,0 1,0:
x | ((1<<k)-1)
- 取 x x x 的第 k k k 位:
(x >> k) & 1
- KaTeX parse error: Expected group after '\text' at position 34: …it}(x)=x \text &̲ (-x)
例题
P4310 绝世好题: 给定一个长度为 n n n 的数列 a i a_i ai,求 a i a_i ai 的子序列 b i b_i bi 的最长长度 k k k,满足 b i & b i − 1 ≠ 0 b_i \& b_{i-1} \ne 0 b<