位运算(1)_常见位运算总结

news2024/12/24 11:45:04

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

位运算(1)_常见位运算总结

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

1. 基础位运算

位运算的基本概念:

位运算的应用:

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

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

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

5. 位图的思想

1. 位图的基本概念

2. 位图的构建

 3. 基本操作

4. 位图的优点

5. 位图的应用

6. 提取一个数(n)二进制表示中最右侧的1

7. 除去一个数(n)二进制表示中最右侧的1

8. 位运算的优先级

9. 异或(^)运算的运算律


1. 基础位运算

运算符描述示例
&按位与

a & b

|按位或a | b
^按位异或a ^ b
~按位取反a ~ b
<<左移a << n
>>右移a >> n

位运算的基本概念:

按位与(AND)(&):

只有对应位都为1时,结果为1。
示例:5 & 3(0101 & 0011 = 0001)结果为 1。

按位或( | ):
对应位有一个为1时,结果为1;只有当对应位都是0时,结果才为0。
示例:5 | 3:(0101 | 0011 = 0111) (结果为7)
  

按位异或(XOR)(^):

对应位不同(一个为1,一个为0)时结果为1。
示例:5 ^ 3(0101 ^ 0011 = 0110)结果为 6。


按位取反(NOT)(~):

将每一位取反(0变1,1变0)。
示例:~5(~0101 = 1010,在补码表示中会得到 - 6)。


左移( << ):

将所有位向左移动n位,右侧补0。相当于乘以2的n次方。
示例:5 << 1(0101 << 1 = 1010)结果为 10。


右移( >> ):

将所有位向右移动n位,左侧补符号位(对于负数,补1;对于正数,补0)。
示例:5 >> 1(0101 >> 1 = 0010)结果为 2。

位运算的应用:

位运算在许多情况下非常有用,常见的应用包括:

快速计算:

位运算可以用于快速计算乘法和除法(通过左移和右移)。


状态存储:

使用位运算可以在单个整数中存储多个布尔值,节省空间。


位掩码(Bitmasking):

通过位运算可以方便地操作集合,例如加入、删除和检查元素。


查找特定位:

检查某一位是否为1,例如 a& (1 << n) 检查整数 a 的第 n 位。

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

方法: (n >> x) & 1

示例:

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

方法: n = n | (1 << x)

示例: 

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

方法: n = n & (~(1 << x))

示例: 

5. 位图的思想

位图(Bitmap)是一种高效的数据结构,用于表示集合或管理数据的存在性。它通过位的方式存储信息,能够在空间和时间上进行优化,特别是在处理大范围的数据时。

1. 位图的基本概念

位图使用一个二进制数组(比特数组)来表示元素的存在性。每一个比特(0或1)对应集合中的一个元素:

如果某个比特为 1,表示集合中存在对应的元素。
如果某个比特为 0,表示集合中不存在对应的元素。


例如,假设我们有一个范围为 0 到 9 的整数集合,可以使用一个大小为 10 的位图:

0 代表数字 0 的存在
1 代表数字 1 的存在

2. 位图的构建

假设我们要管理一组整数,位图的构建步骤如下:

初始化一个数组,大小为最大元素值加一(或按需要的范围进行调整)。
对于每一个要添加到集合中的元素,将对应位设为 1。

 3. 基本操作

插入元素:

对于一个元素x,将位图的第x 位设为 1。
示例:bitmap[x] = 1;


删除元素:

对于一个元素x,将位图的第x 位设为 0。
示例:bitmap[x] = 0;


查询元素:

对于一个元素x,检查位图的第x 位是否为 1。
示例:if(bitmap[x] == 1) { /* 存在 */ }

4. 位图的优点

空间效率:相比于存储完整的数据结构,位图可以大大减少存储空间,特别是在处理大范围的整数时。
快速操作:位图的插入、删除和查询操作时间复杂度为O(1),非常高效。
缓存友好:由于位图在内存中是连续的,可以更好地利用缓存。

5. 位图的应用

集合操作:用于实现集合的并、交、差等操作。
去重:快速检测数据中是否存在重复元素。
压缩存储:在一些场景中,结合其他压缩技术,可以显著减少内存使用。
图像处理:用作图像的像素表示,尤其是黑白图像。
操作系统:在内存管理中,位图常用于表示空闲和占用的内存块。 

6. 提取一个数(n)二进制表示中最右侧的1

方法: n & (-n)

示例: 

 

7. 除去一个数(n)二进制表示中最右侧的1

方法: n & (n - 1)

示例: 

 

8. 位运算的优先级

1. 按位取反(~)
2. 位移运算(左移 << 和 右移 >> )
3. 按位与( & )
4. 按位异或( ^ )
5. 按位或( | )

int a = 5;      // 二进制: 0000 0101
int b = 3;      // 二进制: 0000 0011
int result = a & b | b ^ a << 1;

左移运算:a << 1 先计算,结果是 10(即 0000 1010)。
按位异或:b ^ a 计算,结果是 6(即 0000 0110)。
按位与:a & b 计算,结果是 1(即 0000 0001)。
按位或:最后,1 | 6 计算,结果是 7(即 0000 0111)。 

注意: 如果对位运算的优先级不是很了解的话,括号能加尽加 

9. 异或(^)运算的运算律

1. 交换律
异或运算具有交换性,即对于任意两个数
a和b,有:a^b = b^a
这意味着在进行异或运算时,操作数的顺序可以互换。

2. 结合律
异或运算也具有结合性,即对于任意三个数
a、b 和c,有:(a^b)^c = a^(b^c)
这意味着在进行多个异或运算时,可以自由地重新组合操作数。

3. 身份律
异或运算有身份元素,即对于任意数
a,有:a^0 = a
这表明将任意数与0进行异或运算的结果仍然是该数本身。

4. 自反律
对于任意数a,有:a^a = 0
这意味着一个数与自身进行异或运算的结果是0。

5. 与1的运算
对于任意数a,有:a^1 = ∼a
这表示将一个数与1进行异或运算相当于对该数进行按位取反。

6. 传播性
异或运算满足传播性(或称为分配性),即对于任意数
a、b 和c,有:a^(b^c) = (a^b)^c
这说明无论如何组合多个异或操作,结果都是一致的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

综合练习 学习案例

//验证码 前四位是字母 最后一位是数字 public class test1 {public static void main(String[] args){char [] charsnew char[52];for (int i 0; i <chars.length ; i) {if(i<25){chars[i](char)(i97);}else{chars[i](char)(i65-26);}}Random rnew Random();String cod…

虚商目前有哪些业务痛点?

虚拟运营商当前面临的业务痛点主要集中在市场竞争、运营成本、技术依赖、用户体验及政策监管等方面。 一、市场竞争激烈 1、竞争者数量增加: 随着市场准入门槛的降低&#xff0c;越来越多的企业进入虚拟运营商市场导致市场竟争日益激烈。为了争夺市场份额&#xff0c;企业不得不…

高校体育场小程序|高校体育场管理系统系统|体育场管理系统小程序设计与实现(源码+数据库+文档)

高校体育场管理系统小程序 目录 体育场管理系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道…

量化必备!股票常用数据批量下载、定时更新,代码打包好了!

上一节课我详细演示了从tushare获取股票列表和基本信息并且配置定时更新任务的详细流程&#xff0c;旨在教会想要学习通过Python获取股票数据并且定期更新的朋友。 不过有很多朋友完全没有Python基础&#xff0c;如果一开始把大量时间花费在搞数据上&#xff0c;本末倒置不说&…

学MybatisPlus

1.设置MySql的数据库 spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mp?useUnicodetrue&characterEncodingUTF-8&autoReconnecttrue&serverTimezoneAsia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: MySQL123 logging:l…

GIT安装及集成到IDEA中操作步骤

最近深感GIT使用技能太差&#xff0c;我只会些皮毛&#xff0c;还是得看官网&#xff0c;总结一下常用的操作方法吧。 GIT环境配置到IDEA中安装 一、GIt的基本的安装 这个不在这里赘述了&#xff0c;自己装一个git吧 二、给IDEA指定本地GIT的安装路径 1、下图这个是我本地的…

计算机毕业设计hadoop+spark+hive视频推荐系统 视频情感分析可视化 视频爬虫 视频爬虫 知识图谱 大数据毕设

《HadoopSparkHive视频推荐系统》开题报告 一、引言 随着互联网技术的飞速发展&#xff0c;视频内容呈现出爆炸式增长&#xff0c;用户面临着从海量视频资源中快速找到感兴趣内容的挑战。传统的视频推荐系统已难以满足大规模数据处理的需求&#xff0c;因此&#xff0c;基于H…

迁移学习案例-python代码

大白话 迁移学习就是用不太相同但又有一些联系的A和B数据&#xff0c;训练同一个网络。比如&#xff0c;先用A数据训练一下网络&#xff0c;然后再用B数据训练一下网络&#xff0c;那么就说最后的模型是从A迁移到B的。 迁移学习的具体形式是多种多样的&#xff0c;比如先用A训练…

仿真设计|基于51单片机的智能防火GSM上报仿真

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 &#xff08;1&#xff09;LCD1602显示实时温度&#xff08;DS18B20&#xff09;值和烟雾&#x…

避免学术欺诈!在ChatGPT帮助下实现严格引用并避免抄袭

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 当今的学术环境中&#xff0c;保持学术诚信至关重要。随着ChatGPT等技术的发展&#xff0c;写作变得更加高效&#xff0c;但也增加了不当使用的风险。严格的引用和避免抄袭不仅是学术道…

一个服务器可以搭建几个网站

一个服务器可以搭建几个网站 该省就得省&#xff0c;一台服务器可以搭建多种不同的网站或应用#服务器#服务器租用 多个站点放在同一个服务器上有什么影响吗&#xff1f; 服务器里面会涉及到就是内存和带宽&#xff0c;如果说你一个服务器只放一个网站肯定更好一点&#xff0…

java将word转pdf

总结 建议使用aspose-words转pdf,poi的容易出问题还丑… poi的(多行的下边框就不对了) aspose-words的(基本和word一样) poi工具转换 <!-- 处理PDF --><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres…

计算机网络实验2——利用Wireshark对上网操作抓包并进行相关协议分析(实验部分)

五、实验过程 1.安装并启动Wireshark。 选择菜单栏上捕获->选项&#xff0c;勾选WLAN网卡。点击Start&#xff0c;进行抓包 Wireshark处于抓包状态中 2.打开浏览器&#xff0c;在地址栏中输入教师指定的web服务器地址。&#xff08;http://202.113.78.39&#xff09; 为了…

基于微信小程序的健康管理系统(源码+定制+文档)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL69

脉冲同步器&#xff08;快到慢&#xff09; 描述 sig_a 是 clka&#xff08;300M&#xff09;时钟域的一个单时钟脉冲信号&#xff08;高电平持续一个时钟clka周期&#xff09;&#xff0c;请设计脉冲同步电路&#xff0c;将sig_a信号同步到时钟域 clkb&#xff08;100M&…

VMware ESXi 6.7U3u macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025

VMware ESXi 6.7U3u macOS Unlocker & OEM BIOS 2.7 集成 Realtek 网卡驱动和 NVMe 驱动 (集成驱动版) UI fix 此版本解决的问题&#xff1a;VMware Host Client 无法将现有虚拟磁盘 (VMDK) 附加到虚拟机 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-…

基于springboot的数据库原理教学案例案例库管理系统

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 &#xff08;1&#xff09;与指导老师确定系统主要功能&#xff1b; &#xff08;2&am…

tftp传文件被服务器拒绝进入tftp: server error: (768) Access to staonline.pcap denied

环境&#xff1a;测试一个ac下挂ap&#xff0c;ap下的抓包文件传出时&#xff0c;出现问题&#xff1a; ac的wan口ip是192.168.186.167/24&#xff0c;gw是192.168.186.1&#xff0c;下挂ap的ip是192.168.202.199/24&#xff0c;ac上开子接口192.168.202.1/24&#xff0c;ac上开…

【MySQL】数据目录迁移

一、使用场景 使用该方法一般是数据目录所在磁盘不支持扩展&#xff0c;只能通过新加磁盘来扩展数据目录磁盘空间。通常是Windows服务器&#xff0c;或者是Linux服务器的mysql数据目录的磁盘没有使用lvm。 二、准备工作 1. 新磁盘初始化&#xff0c;达到可使用状态 2. 需要自己…

鸿蒙NEXT开发-自定义构建函数(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…