程序设计竞赛中常见二进制的数学特性与应用技巧总结
前言
本文会主要收录在程序设计竞赛中常见的二进制数学特性,以个人视角按出现频率或重要程度排序。
如有补充欢迎评论。
参考了一些二进制数的特性 - Hozenplotz,致谢。
二进制真的好神奇好神奇。
特性
n << 1等于n *= 2n >> 1等于n /= 2(\(n>=0\))n & 1为 \(True\) 则为奇数,反之为偶数。n & 1为 \(True\) 时说明二进制最低位为 \(1\),反之为 \(0\)。1 << n等于pow(2, n)(\(2^n\)),且远快于后者。- 如果一个二进制数的低端 \(n\) 位都是 \(0\),那么这个数就可以被 \(2n\) 整除。
- 如果一个二进制数的第 \(n\) 位是 \(1\),其他各位都是 \(0\),那么这个数等于 \(2n\)。
- 相应的,如果一个二进制数的第 \(0\) 位到第 \(n\) 位都是 \(1\),而其他各位都是 \(0\),那么这个数等于 \(2n-1\)。
- \(n\) 位二进制数有 \(2 ^ n\) 个不同的组合可能。
应用技巧
- 遇到需要
pow(2, n)的时候,用1 << n,就算你开了-O2。 __builtin_popcount(x)可以高效计算 x 的二进制中 1 的个数。a & b可以判断 \(a\) 和 \(b\) 有哪些位数同为 \(1\),配合上__builtin_popcount()会很爽。- \(1<<n-1\) 是 \(n\) 位全是1的二进制数。注意有 \(-1\)。

浙公网安备 33010602011771号