星

星尘客栈-笔记站

A text-focused Halo theme

  • 首页
  • 标签
  • 分类
  • 关于本站
主页 位运算
文章

位运算

发表于 2025-08-20 更新于 2025-08- 20
作者 Ruibin_Ningh
9~12 分钟 阅读

运算

符号

示例

说明

按位与

&

6 & 3 = 2

都为 1 才为 1

按位或

|

`

逐位比较,有 1 就是 1

按位异或

^

6 ^ 3 = 5

不同为 1,相同为 0

取反

~

~6 = -7

二进制逐位取反(补码规则)

左移

<<

3<<2 = 12

相当于乘 $2^2$

右移

>>

12>>2 = 3

相当于除 $2^2$(向下取整)

(1) 判断奇偶

if(x&1) cout<<"odd"; // 奇数
else cout<<"even";   // 偶数

(2) 取二进制某一位

(x>>k)&1  // 取第 k 位 (0-based)

(3) 设置某一位为 1

x |= (1<<k);

(4) 清零某一位

x &= ~(1<<k);

(5) 翻转某一位

x ^= (1<<k);

3. 与低位相关的技巧

(1) 取最低位的 1

x & -x

例:12 (1100) → 4 (0100)

(2) 去掉最低位的 1

x &= (x-1);

例:12 (1100) → 8 (1000)

(3) 判断是否是 2 的幂

(x>0 && (x&(x-1))==0)

4. 子集枚举

(1) 枚举 n 位二进制的所有子集

for(int s=0;s<(1<<n);s++){...}

(2) 枚举某集合 S 的所有子集

for(int sub=S;sub;sub=(sub-1)&S){...}

最后还需要单独考虑空集。


5. 位运算加速

  • 快速乘除以 2:
    x<<1 = x*2
    x>>1 = x/2

  • 交换两个数(不使用临时变量):

a^=b; b^=a; a^=b;
  • 取绝对值(int):
(x^(x>>31))-(x>>31)

技巧
位运算 技巧 oi
许可协议:  CC BY 4.0
分享

相关文章

8月 20, 2025

位运算

下一篇

线段树模版

上一篇

数学中的逻辑运算符

最近更新

  • 原码反码和补码
  • 数学中的逻辑运算符
  • 位运算
  • 线段树模版
  • 最近公共祖先

热门标签

oi 线段树 技巧 树上问题 位运算

目录

©2025 星尘客栈-笔记站. 保留部分权利。

使用 Halo 主题 Chirpy