Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • 哈希表

  • 双指针

  • 数组

  • 字符串

  • 链表

  • 树

  • 回溯

  • 动态规划

  • 图

  • 二分查找

  • 贪心

  • 栈&队列

  • 堆

  • 位运算

    • 位运算
    • 位运算总结
      • 集合与集合
      • 集合与元素
      • 函数库
      • 集合遍历
      • 集合枚举
      • 其它
  • 数据结构设计

  • rui的精选题单

  • 笔试真题

  • LeetCode周赛

  • ACM模式输入输出
  • 数学

  • 数据结构与算法
  • 位运算
Nreal
2024-01-31
目录

位运算总结

参考:从集合论到位运算,常见位运算技巧分类总结! - 力扣(LeetCode) (opens new window)

# 集合与集合

术语 位运算 举例 举例
交 &
并 |
对称差 ^ {0,2,3}^{0,1,2}={1,3} 1101^0111=1010
差 &~ {0,2,3}\{1,2}={0,3} 1101&(~0110)=1001
差(子集) ^ {0,2,3}\{0,2}={3} 1101^0101=1000

# 集合与元素

术语 位运算 举例 举例
单元素集合 << {2} 1<<2
全集 (1<<n)-1 {0,1,2,3} (1<<4)-1
补集 ~
属于 (s>>i)&1=1 2∈{0,2,3} (1101>>2)&1=1
不属于 (s>>i)&1=0
删除元素 s&~(1<<i) {0,2,3}\{2} 1101&~(1<<2)
删除元素(在集合中) s^(1<<i) {0,2,3}\{2} 1101^(1<<2)
删除最小元素 s&(s-1)
添加元素 s|(1<<i) {0,3}∪{2} 1001|(1<<2)

# 函数库

集合大小: Integer.bitCount(s);

二进制长度(-1得到集合最大元素): 32-Integer.numberOfLeadingZeros(s);

集合中最小元素: Integer.numberOfTrailingZeros(s);

lowbit获取二进制最低1及后面0: s & -s;

# 集合遍历

遍历0~n-1每个元素,判断元素是否在集合s中

for(int i=0;i<n;i++){
    if(((s>>i)&1) == 1){
        //处理i的逻辑
    }
}
1
2
3
4
5

# 集合枚举

空集枚举到全集

for(int s=0;s<(1<<n);s++){
    //处理s逻辑
}
1
2
3

从大到小,枚举s的所有非空子集

for(int sub=s;sub>0;sub=(sub-1)&s){
    //处理sub逻辑
}
1
2
3

# 其它

判断奇偶:(x&1)== 0 偶 ,(x&1)==1 奇

交换:

a = a^b;
b = a^b;
a = a^b;
1
2
3

判断1的个数:

int cnt = 0;
while(x!=0){
    cnt++;
    x = x&(x-1);
}
1
2
3
4
5

判断2的幂:

boolean ans = x>0 && (x&(x-1)) == 0;
1
位运算
队列与栈

← 位运算 队列与栈→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式