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

位运算总结

在这里插入图片描述

文章目录

    • 🍈1. 基础位运算
    • 🍌2. 给一个数`n`,确定它的二进制表示中的第`x`位是`0`还是`1`
    • 🍏3. 将一个数`n`的二进制表示的第`x`位修改成`1`
    • 🍓4. 将一个数的`n`的二进制表示的第`x`位修改成`0`
    • 🥔5. 位图的思想
    • 🫒6. 提前一个数`n`二进制中最右侧的`1`
    • 🫑7. 干掉一个数`n`二进制表示中最右侧的`1`
    • 🧄8. 运算符优先级
    • 🫘9. 异或`^`运算符的运算律

🍈1. 基础位运算

  • >>:右移操作符——二进制补码右移
  • <<:左移操作符——二进制补码左移
  • ~:按位取反操作符——二进制补码按位取反
  • &:按位与——有假则假(有00)
  • |:按位或——全真为真(全11)
  • ^:按位异或/无进位相加——相同为0,不同为1

不是很了解的可查看此篇文章:C语言——操作符(上)

🍌2. 给一个数n,确定它的二进制表示中的第x位是0还是1

我们先做一个约定:

计算几位几位的时候,从最低位开始(最右侧)

image-20231128194604799

这样的好处就是当我们要左移操作到最低位的时候,直接移动对应的第几位即可

那我们要确定这一位是0还是1,只需要让这个位置& 1即可,这里有两种方法:

  1. 1左移到这个对应的位置,再按位与,这个不常见
  2. 让这个位右移到最低位,然后& 1即可
(n>>x) & 1

🍏3. 将一个数n的二进制表示的第x位修改成1

这里我们让这个一位按位或| 1即可,然后其他位按位或| 0。想要这样,我们只需要将1左移x位即可1<<x

image-20231128200422309

🍓4. 将一个数的n的二进制表示的第x位修改成0

让当前位置按位与上& 0,只需要将1左移到对应位置,然后按位取反,即其他位置全是1,此时这个位置为0

image-20231128201954059

🥔5. 位图的思想

位图的本质其实就是一个哈希表,在大多数情况下都是一个数组,而位图则是用int的二进制位来记录信息。

那这样我们就经常要用到上面的三个思想,来查看或者修改这个二进制位。

关于位图的具体内容,可以查看此篇文章:位图bitset及其应用——【C++实现】

🫒6. 提前一个数n二进制中最右侧的1

这里直接让n & -n即可

-n就是按位取反再+1

image-20231128215419482

我们发现这个-n的操作,本质上其实就是将最右侧的1左边的区域全部变成相反

然后我们按位与下,那么这前面的区域就全部变为0了,这样就实现了将最右侧的1给提取出来了

🫑7. 干掉一个数n二进制表示中最右侧的1

这里的意思就是将最右侧的二进制1变为0,这里只需将n & (n-1)即可

这里n-1的本质就是如果后面是连续的0,则需要一直借位,直到借到1为止,借完之后要-1

image-20231128220252676

所有就是让最右侧的1作为分界线,右边的区域全部变成相反

🧄8. 运算符优先级

能加括号就加括号!这样一定不会错!

能加括号就加括号!这样一定不会错!

能加括号就加括号!这样一定不会错!

🫘9. 异或^运算符的运算律

  1. a^0= a
  2. a^a = 0 (消消乐)
  3. a ^ b ^ c = a ^ (b ^ c)

http://www.kler.cn/a/148418.html

相关文章:

  • idea 弹窗 delete remote branch origin/develop-deploy
  • 会话信息处理: HttpSession、token序列化、收集登录设备信息、基于`spring-session-data-redis`实现session共享。
  • 学法减分交管12123模拟练习小程序源码前端和后端和搭建教程
  • 第一个 Flutter 项目(1)共46节
  • 【Linux】-学习笔记03
  • 力扣104 : 二叉树最大深度
  • linux下的工具---yum
  • 为第一个原生Spring5应用程序添加上Log4J日志框架!
  • Vue2问题:如何全局使用less和sass变量?
  • TypeScript 学习笔记 第二部分 webpack 创建typescript项目
  • vue3中shallowReactive与shallowRef
  • Kotlin语言的一些技术点
  • Redis 与其他数据库的不同之处 | Navicat
  • 【业务实战】mysql数据库中<标签tag功能>一般是怎么设计的?
  • 【RLChina2023】CCF 苏州 记录
  • 微信小程序开发——项目开发入门
  • C++ 泛型编程,函数模版和类模版
  • 高等数学零基础篇复习笔记
  • 离线配置conda环境
  • 基于Python的网络爬虫设计与实现
  • LeetCode-805.保持城市天际线 C/C++实现 超详细思路及过程[M]
  • Android BSP 开发之六
  • 什么是网络爬虫技术?它的重要用途有哪些?
  • 商用车的智慧眼车规级激光雷达
  • java 系统属性和环境属性
  • 计算机网络基础知识自用