C++优选算法五 位运算

一、位运算

位运算(Bitwise Operations)是直接在整数的二进制表示上进行的操作。这些操作包括位与(AND)、位或(OR)、位非(NOT)、位异或(XOR)、左移(Left Shift)和右移(Right Shift)等。位运算在处理低级别数据、优化性能、实现加密算法等方面非常有用。以下是这些操作的详细介绍:

  1. 位与(Bitwise AND, &)
    • 对应位都为1时,结果位才为1,否则为0。
    • 示例:5 & 3,二进制表示为 101 & 011,结果为 001,即 1
  2. 位或(Bitwise OR, |)
    • 对应位只要有一个为1,结果位就为1。
    • 示例:5 | 3,二进制表示为 101 | 011,结果为 111,即 7
  3. 位非(Bitwise NOT, ~)
    • 将每一位取反,0变为1,1变为0。
    • 示例:~5,二进制表示为 ~101,结果为 010(注意,这是补码表示,实际结果取决于整数表示方式,如8位二进制表示则为 ...1111010,即 -6)。
  4. 位异或(Bitwise XOR, ^)
    • 对应位不同则结果为1,相同则结果为0。
    • 示例:5 ^ 3,二进制表示为 101 ^ 011,结果为 110,即 6
  5. 左移(Left Shift, <<)
    • 将二进制位向左移动若干位,右边补0。
    • 示例:5 << 1,二进制表示为 101 << 1,结果为 1010,即 10
  6. 右移(Right Shift, >>)
    • 将二进制位向右移动若干位,对于无符号整数,左边补0;对于有符号整数,左边补符号位(即保持正负性)。
    • 示例:5 >> 1,二进制表示为 101 >> 1,结果为 010,即 2

应用场景

  • 性能优化:位运算通常比算术和逻辑运算更快,因为它们直接在硬件层面实现。
  • 权限控制:在操作系统中,权限控制经常通过位掩码(bitmask)实现,每个权限对应一个位。
  • 图形处理:位运算在图形处理中非常常见,如颜色编码、图像压缩等。
  • 加密算法:一些加密算法(如DES、AES)依赖于复杂的位运算。

注意事项

  • 整数表示:不同编程语言和平台对整数的表示(如位数、有符号/无符号)可能不同,这会影响位运算的结果。
  • 溢出:左移操作可能导致数值溢出,特别是当移位次数超过整数的位数时。
  • 符号扩展:右移操作对于有符号整数时,需要注意符号扩展(sign extension),即保持数值的符号不变。

通过理解和应用位运算,可以编写出更高效、更紧凑的代码,特别是在处理底层数据和算法优化时。

二、示例题目

1.判断字符是否唯一. - 力扣(LeetCode)

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

示例 1:

输入: s= "leetcode"
输出: false 

示例 2:

输入: s= "abc"
输出: true

解法(位图的思想)
算法思路:

利用「位图」的思想,每一个「比特位」代表一个「字符,一个 int 类型的变量的 32 位足够表示所有的小写字母,比特位里面如果是0,表示这个字符没有出现过。比特位里面的值是1,表示该字符出现过。
那么我们就可以用一个「整数」来充当 「哈希表」。

class Solution {
public:bool isUnique(string astr) {if(astr.size()>26)return false;int bit=0;for(char ch:astr){int i=ch-'a';//判断字符是否出现过if(bit>>i&1==1)return false;//把当前字符加入到位图中bit|=(1<<i);}return true;}
};

2.丢失的数字. - 力扣(LeetCode)

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

示例 1:

输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 2:

输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 3:

输入:nums = [9,6,4,2,3,5,7,0,1]
输出:8
解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

解法(位运算):
算法思路:

设数组的大小为n,那么缺失之前的数就是在[0,n],数组中是在 [0,n] 缺失一个数形成的序列。
如果我们把数组中的所有数以及 [0,n] 中的所有数全部「异或」在一起,那么根据「异或」运算的「消消乐」规律,最终的异或结果应该就是缺失的数。

class Solution {
public:int missingNumber(vector<int>& nums) {int bit=0;for(int i=0;i<nums.size();i++){bit^=nums[i];}for(int i=0;i<=nums.size();i++){bit^=i;}return bit;}
};

3.两整数之和. - 力扣(LeetCode)

给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。

示例 1:

输入:a = 1, b = 2
输出:3

示例 2:

输入:a = 2, b = 3
输出:5

解法(位运算):
算法思路:

  • 异或 ^运算本质是「无进位加法」;
  • 按位与 &操作能够得到「进位」;

然后一直循环进行,直到「进位」变成 0为止。

class Solution {
public:int getSum(int a, int b) {int num=a^b;//无进位相加结果int sum=a&b;//算出进位while(sum!=0){sum<<=1;int n = num;num^=sum;sum&=n;}return num;}
};

4.只出现一次的数字Ⅱ. - 力扣(LeetCode)

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

示例 1:

输入:nums = [2,2,3,2]
输出:3

示例 2:

输入:nums = [0,1,0,1,0,1,99]
输出:99

解法(比特位计数):
算法思路:

设要找的数为ret。
由于整个数组中需要找的元素只出现「一次」,其余的数都出现的「三次」,因此我们可以根据据所有数的「某一个比特位」的总和 % 3,的结果,快速定位到ret的「一个比特位上」的值是 0 还是 1。
这样,我们通过的每一个比特位的值,就可以将 ret 给还原出来。

class Solution {
public:int singleNumber(vector<int>& nums) {int ret=0;for(int i=0;i<32;i++)//依次去修改ret中的每一位比特位{int sum=0;for(int x:nums)//计算nums中所有的数的第i位的和{if(((x>>i)&1)==1)sum++;}sum%=3;if(sum==1)ret|=1<<i;}return ret;}
};

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

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

相关文章

腐蚀图像分割系统:前端交互展示

腐蚀图像分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-DySnakeConv&#xff06;yolov8-seg-LSKNet等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al…

NIM 平台生成式 AI-demo

需要python环境 官网注册&#xff1a;&#xff08;后续调用模型需要秘钥key&#xff09;Try NVIDIA NIM APIs 可以看到有多种模型&#xff1a; 官方案例 1.安装相关依赖&#xff1a; pip install langchain_nvidia_ai_endpoints langchain-community langchain-text-splitt…

欢迎使用Markdown编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

智慧医疗:AI如何改变传统医疗服务模式?

内容概要 在如今的医疗界&#xff0c;智慧医疗正如一阵旋风&#xff0c;呼啸而来&#xff0c;打破了传统的模式。这一变革的核心&#xff0c;毫无疑问是人工智能。想象一下&#xff0c;一个不需要排队候诊、甚至不需要出门的医生——这就是智能助手的非凡魅力&#xff01;通过…

1.kubernetes作用及组件

容器管理集群名称叫做k8s 容器的编排工具&#xff1a;swarm&#xff0c;kubesphere&#xff0c;open shift&#xff0c;kubernetes【市场占比大】 一.kubernetes介绍 1.kubernetes是什么&#xff1f; 由谷歌公司开源的应用&#xff0c;基于go语言编写 简称k8s 2.kubernet…

【AcWing】算法基础课-动态规划

目录 1、闫式DP分析法 2、背包问题 2.1 01背包问题 朴素版本 优化版本 2.2 完全背包问题 朴素版本 优化版本 2.3 多重背包问题 朴素版本 二进制优化 2.4 分组背包问题 3、线性DP 3.1 数字三角形 3.2 最长上升子序列 3.3 最长公共子序列 4、区间DP 5、数位统计…

白天用的投影仪哪款好?掌握这个亮度参数谁敢忽悠你

人们追求松弛人生的同时&#xff0c;也着眼于高品质的家庭娱乐体验&#xff0c;高端家用投影仪以其大屏幕的视觉冲击力和便捷的移动性&#xff0c;应运成为众多家庭客厅、卧室的新宠。而在挑选家用投影仪时&#xff0c;亮度作为衡量其性能的重要指标之一&#xff0c;直接影响着…

七牛云OSS的使用

图片上传 一、七牛云oss介绍 1.1 图片存储介绍 在实际开发中&#xff0c;我们会有很多处理不同功能的服务器。例如&#xff1a; 应用服务器&#xff1a;负责部署我们的应用 数据库服务器&#xff1a;运行我们的数据库 文件服务器&#xff1a;负责存储用户上传文件的服务器…

重新构想定性数据分析:使用 NVivo 15 实现 AI、反思和备忘录

NVivo 是研究出版物中引用最多的定性数据分析软件 (QDA 软件),使用 NVivo v15 最新主要版本从定性和混合方法数据中发现更多信息&#xff0c;融合 Lumivero AI Assistant 更快地识别主题、运行高级查询和发现基于证据的见解&#xff0c;让您在更短的时间内获得严谨的研究结果。…

C++【string的模拟实现】

在前文我们讲解了string类接口使用&#xff08;C【string类的使用】(上),C【string类的使用】&#xff08;下&#xff09;&#xff09;&#xff0c;本片文章就来模拟实现string类。 注&#xff1a;本文实现的是string的部分重点内容&#xff0c;目的是为了更好的了解string&…

zabbix安装配置与使用

zabbix Zabbix的工作原理如下: 监控部分: Zabbix Agent安装在各个需要监控的主机上,它以主配置的时间间隔(默认60s)收集主机各项指标数据,如CPU占用率、内存使用情况等。 通讯部分: Agent会把收集的数据通过安全通道(默认10051端口)发送到Zabbix Server。Server会存储这些数…

7.3、实验三:RIPv2的基本配置

源文件&#xff1a; 7.3、实验三&#xff1a;RIPv2的基本配置: https://url02.ctfile.com/d/61945102-63684790-45f44b?p2707 (访问密码: 2707) 一、目的 能够使用RIPv2路由协议 二、实验要求 1.要求 使用RIPv2协议&#xff0c;使得PC0 和 Service0能够通信&#xff0c;…

石岩田心村的地面停车点(月卡350)

​我之前一直以为城中村里的地面停车场会比上屋地铁口的联天停车场便宜一些。没想到这个田心村月卡也是350元哈。比对面的园岭村还贵&#xff0c;元岭村月卡我记得才260元。 田心村停车场标识牌 序号 收费项目 收费标准 1 小车临时停放 10元/小时&#xff0c;超过1小时加收…

大模型学习笔记------CLIP模型的再思考

大模型学习笔记------CLIP模型的再思考 1、CLIP模型与Prompt(提示)的思考2、CLIP模型与ResNet等分类模型的根本区别3、结束语 上文已经讲 CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09;这个模型&#xff0c;也讲了我的一些思考。但是&#xff0c;随着深…

Spring之依赖注入(DI)和控制反转(IoC)——配置文件、纯注解

依赖注入 依赖注入(Dependency Injection&#xff0c;简称 DI)与控制反转(loC)的含义相同&#xff0c;只不过这两 个称呼是从两个角度描述的同一个概念。对于一个 Spring 初学者来说&#xff0c;这两种称呼很难理解, 下面我们将通过简单的语言来描述这两个概念。 当Java对象&…

外网访问 Immich 照片管理软件

Immich 是一个自托管的照片和视频备份的平台&#xff0c;它允许用户在私有服务器上存储、管理和分享他们的照片&#xff0c;视频等媒体文件。 第一步&#xff0c;本地部署安装 Immich 1&#xff0c;检查 Docker 服务状态&#xff0c;确保 Docker 正常运行。 systemctl statu…

Linux网络命令:它用于实时监控网络接口的状态变化的命令 ip monitor详解

目录 一、概述 二、使用 1、语法 2、对象类型 3、常用选项 4、获取帮助 三、 示例 1. 监视链路层变化 2. 监视所有的网络变化 3. 仅监视路由表的变化 4. 监视特定网络接口的状态变化&#xff1a; 5. 监视网络接口地址的变化 四、实际应用 五、其他事项 一、概述 …

QT仿QQ聊天项目,第三节,实现主界面(好友列表)

目录 一&#xff0c;主界面示例 二&#xff0c;主界面控件组成 三&#xff0c;好友列表实现 1&#xff0c;好友列表的实现原理 2&#xff0c;实现示例代码 一&#xff0c;主界面示例 二&#xff0c;主界面控件组成 三&#xff0c;好友列表实现 1&#xff0c;好友列表的实现…

查找连表的倒数第k个节点

居安思危 何解&#xff1f; 1、假如有1、2、3三个节点&#xff0c;找倒数第二个&#xff0c;实际是整数第几个&#xff1f; 3-21 2 &#xff1a; 及 length - k 1 ,所以先遍历找节点长度&#xff0c;在遍历找所需节点 // 今天这不是力扣的var findNode function(head , k){…

练习LabVIEW第三十九题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十九题&#xff1a; 程序开始运行后要求用户输入密码&#xff0c;密码正确时字符串显示控件显示 “欢迎进入”&#x…