程序设计竞赛中常见二进制的数学特性与应用技巧总结

前言

本文会主要收录在程序设计竞赛中常见的二进制数学特性,以个人视角按出现频率或重要程度排序。
如有补充欢迎评论。
参考了一些二进制数的特性 - Hozenplotz,致谢。
二进制真的好神奇好神奇。

特性

  1. n << 1 等于 n *= 2
  2. n >> 1 等于 n /= 2 (\(n>=0\))
  3. n & 1\(True\) 则为奇数,反之为偶数。
  4. n & 1\(True\) 时说明二进制最低位为 \(1\),反之为 \(0\)
  5. 1 << n 等于 pow(2, n)(\(2^n\)),且远快于后者。
  6. 如果一个二进制数的低端 \(n\) 位都是 \(0\),那么这个数就可以被 \(2n\) 整除。
  7. 如果一个二进制数的第 \(n\) 位是 \(1\),其他各位都是 \(0\),那么这个数等于 \(2n\)
  8. 相应的,如果一个二进制数的第 \(0\) 位到第 \(n\) 位都是 \(1\),而其他各位都是 \(0\),那么这个数等于 \(2n-1\)
  9. \(n\) 位二进制数有 \(2 ^ n\) 个不同的组合可能。

应用技巧

  1. 遇到需要 pow(2, n) 的时候,用 1 << n,就算你开了 -O2
  2. __builtin_popcount(x)可以高效计算 x 的二进制中 1 的个数
  3. a & b 可以判断 \(a\)\(b\) 有哪些位数同为 \(1\),配合上 __builtin_popcount() 会很爽。
  4. \(1<<n-1\)\(n\) 位全是1的二进制数。注意有 \(-1\)
posted @ 2025-09-07 18:00  Misaka2298  阅读(8)  评论(0)    收藏  举报