算法进阶指南之位运算
基本运算符
& 与
| 或
~ 非
xor 异或
补码
- 32位无符号整数 unsigned int
全0表示0
全一表示4294967295 - 32位无符号整数 int
全0表示0
全一表示-1
发生算数溢出时对2^32取模,得负数 - 建议memset语句初始化数组,正无穷的值为0x3f
移位运算
- 左移
在二进制表示下把数字同时向左移动,低位以0填充,高位越界后舍弃
- 算数右移
在二进制表示下把数字同时向右移动,高位以符号位填充,低位越界后舍弃
相当于向下取整,c++中除是向0取整
- 逻辑右移略
大数运算取模
将一个数用二进制表示,每次与一个二进制位运算并取模
取出整数n在二进制表示下的第k位(n >> k) & 1 //让第k个元素变成第一个元素
取出整数n在二进制表示下的第0 ~ k - 1位 n & ((1 << k) - 1) // 1 << k => 1000…,再减1,变成0111…
把整数n在二进制下的第k位取反 n ^ (1 << k)
对整数n在二进制表示下的第k位赋值1 n | (1 << k)
对整数n在二进制表示下的第k位赋值0 n | ~(1 << k)
成对变换
当n为偶数时, n^1 == n + 1;
当n为奇数时,n^1 == n - 1;
lowbit运算
lowbit(n)取出非负整数n在二进制表示下最低位1以及它后面0构成的数值
lowbit(n) = n & (~n + 1) = n & (-n) // n + (~n) == 1
分类:
# 刷题、比赛与杂谈
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!