当前位置: 首页 > news >正文

【位运算】常见算法公式使用

1. 基本位运算符

运算符描述示例(二进制)
&按位与1010 & 1100 = 1000
|按位或1010 | 1100 = 1110
^按位异或1010 ^ 1100 = 0110
~按位取反~1010 = 0101(结果依赖位数)
<<左移1010 << 2 = 101000
>>右移(算术/逻辑)1010 >> 2 = 0010(逻辑右移)

2. 常见位运算技巧

① 判断奇偶
  • x & 1:结果为 1 是奇数,0 是偶数。

② 交换两个数
  • 不用临时变量:

    a ^= b;  // a = a ^ b
    b ^= a;  // b = b ^ (a ^ b) = a
    a ^= b;  // a = (a ^ b) ^ a = b
③ 取最低位的 1
  • x & (-x):获取二进制中最右边的 1(如 1010 → 0010)。

④ 清除最低位的 1
  • x & (x - 1):将最右边的 1 置 0(如 1010 → 1000)。

    • 应用:统计二进制中 1 的个数:

      int count = 0;
      while (x) {x &= (x - 1);count++;
      }
⑤ 判断是否为 2 的幂
  • x & (x - 1) == 0:若为 true,则 x 是 2 的幂(如 1000)。

⑥ 确定某一位是 0 还是 1
int getBit(int num, int x) {return (num >> x) & 1;  // 将第 x 位移到最低位后取末位
}
⑦ 将某一位修改为 1
int setBit(int num, int x) {return num | (1 << x);  // 用或操作设置第 x 位
}
⑧ 将某一位修改为 0
int clearBit(int num, int x) {return num & ~(1 << x);  // 用与操作清零第 x 位
}

 

http://www.dtcms.com/a/191117.html

相关文章:

  • 建筑IT数字化突围:建筑设计企业的生存法则重塑
  • STM32入门笔记(05):内部高速8Mhz时钟最大时钟可以设置 64 Mhz?如何修改system_stm32f10x.c里面的代码?
  • 基于OAuth2+SpringSecurity+Jwt实现身份认证和权限管理后端服务
  • 操作系统-物理结构
  • 最大子段和(就是之前总结线性dp思想)
  • “小显存”也能启动大模型
  • libmemcached库api接口讲解三
  • 可视化图解算法39: 输出二叉树的右视图
  • 前端表格滑动滚动条太费事,做个浮动滑动插件
  • synchronized关键字详解
  • 有关多线程
  • 总共76dp 空出20dp然后放一个控件的写法
  • Spring 中的 @ComponentScan注解详解
  • Android Framework学习五:APP启动过程原理及速度优化
  • Redis内存淘汰策略和过期键删除策略有哪些?
  • TAOCMS漏洞代码学习及分析
  • 微信开发者工具里面模拟操作返回、录屏、网络速度、截屏等操作
  • 企业级IP代理解决方案:负载均衡与API接口集成实践
  • 【CUDA】Sgemm单精度矩阵乘法(上)
  • 达梦数据库 【-6111: 字符串转换出错】问题处理
  • 【AI大模型】赋能【传统业务】
  • React构建组件
  • 微信小程序学习之轮播图swiper
  • 【unity游戏开发——编辑器扩展】EditorWindow自定义unity窗口拓展
  • 橙子、橘子相关(果实、叶片、疾病等)数据集大合集
  • SQL注入报错“Illegal mix of collations for operation ‘UNION‘”解决办法
  • 材料×工艺×AI:猎板PCB重构汽车电子四层板技术逻辑
  • [滑动窗口]越短越合法(可转化成越长越合法)
  • docker-compose的使用总结
  • Linux下的c/c++开发之操作Redis数据库