算法笔记~—位运算

 

目录

常见位运算:

1、基础位运算

2、对于一个数n。确定、修改这个数n二进制x位。

3、提取(确定)一个数n最右侧的1(bit)与干掉最右侧的1(bit)

4、异或运算律

5、位运算的优先级:加括号 

6、练习


常见位运算:

1、基础位运算

按位与、或、取反、异或、算术右移、算术左移:& 、|、~、^、>>、<<。

与:有0是0,全1为1;

或:有1是1,全0为0;

取反:按位取反

异或:相同为0,不同为1,同时异或也是无进位相加。(重点)

算术右移:仅对于有符号数,对于无符号数为逻辑右移

算术左移:仅对于有符号数,对于无符号数为逻辑左移,逻辑左移与算术右移操作一样无区别。

注意:算术和逻辑左/右移指的是一种特定操作。

2、对于一个数n。确定、修改这个数n二进制x位。

注:x为数n的范围内任意位

确定某位:

(int)1的 二进制为:000000……0001;按位与1后,除最低位外所有位变为0,判断最低位,为1,所有数n的x位为1,反之为0。

(n>>x)&1==1? 1:0;//数n的x位为1,返回1,为0返回0。

修改某位为1:

将(int)1左移x位,变成如下:

然后与数n按位或 ,(bit)0与任意或为任意,1与任意或为1,所有将数n的x位置为1。

n=n|(1<<x);//修改数n的x位为1。

修改某位为0:

将(int)1左移x位,在按位取反,变成如下,除了x位外都为1.

然后与数n按位与,(bit)1与任意与为任意,0与任意与为0,所以将数n的x位置变为0。

n=n&(~(1<<x));//修改n的x位为0.

小结:setbit(位图) 利用的就是这种思想。setbit就是一种特殊的hash表,用一个bit位来存储状态信息。

3、提取(确定)一个数n最右侧的1(bit)与干掉最右侧的1(bit)

原理:-n为:将最右侧的1的左边的数全部取反,然后与数n相与。

bit=n&(-n);

原理:n-1为将最右侧的1的右边的数全部取反,然后与数n相与

n=n&(n-1);

4、异或运算律

a^0=a;//
a^a=0;//消消乐
a^b^c=a^c^b;//交换律

例题:136. 只出现一次的数字 - 力扣(LeetCode)

思路:同数异或相消

 

260. 只出现一次的数字 III - 力扣(LeetCode)

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {int Xor=0;for(int num:nums) { //取出两个一次数相互异或所得数Xor^=num;}int sub =(Xor==INT_MIN ? Xor:Xor&(-Xor));//-128对于128超出范围int type1 =0,tyep2=0;for(int num:nums){if(sub&num) type1^=num;else tyep2^=num;}return {type1,tyep2};}
};

5、位运算的优先级:加括号 

6、练习

面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)

class Solution {
public:bool isUnique(string astr) {if(astr.size()>26) return false;int bitset=0;//位图for(char ch:astr){int i=ch-'a';   //字符映射到bitset的第i位if((bitset>>i)&1)  return false;     //判断bitset的第i位的值是否为1//bitset存入状态bitset=bitset|(1<<i);}return true;}
};

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

思路:同数异或相消

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

class Solution {
public:int getSum(int a, int b) {//利用无进位相加while(b!=0){int x=a^b;//无进位相加int carry=(a&b)<<1;//进的位的值a=x;b=carry;//循环直到b=0,表示没有进位}return a;}
};

137. 只出现一次的数字 II - 力扣(LeetCode)

class Solution {
public:int singleNumber(vector<int>& nums) {//通过位运算,得出每一位的0还是1.int ret=0;for(int i=0;i<32;i++){int sum=0;for(int val:nums){if(((val>>i)&1)==1)  sum+=1;//3n+1或3n+0}if(sum%3==1){ret|=(1<<i);}}return ret;}
};

可以推广到:只出现一次的数字(如果是两个?不可以,无法获得两个数的异或来分类),其他的数都出现n次。

面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

class Solution {
public:vector<int> missingTwo(vector<int>& nums) {int n=nums.size();int N=n+2;//1~N个数字,构建只出现一次的两个数//异或相消,int Xor=0;for(int num:nums){Xor^=num;}for(int i=1;i<N+1;i++){Xor^=i;}//此时Xor为消失的两数字相互异或,通过最低位区分两个不同的数int sub=Xor==INT_MIN?Xor:Xor&(-Xor);//根据缺失两数的最低位不同int type1=0,type2=0;for(int num:nums){if((num&sub)==0) type1^=num;else type2^=num;}for(int i=1;i<N+1;i++){if((i&sub)==0) type1^=i;else type2^=i;}return {type1,type2};}
};

算法原理: 通过添加构建1~N,将问题降级为仅有两个仅出现一次的数字。

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

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

相关文章

vscode 配置c++环境——3个文件搞定!!!

前提&#xff1a; 在vscode中安装了c扩展 创建文件settings.json {"files.associations": {"string": "cpp","vector": "cpp","array": "cpp","atomic": "cpp","*.tcc"…

[C++]函数重载(什么是函数重载,函数重载的原理(底层怎么实现))

一、什么是函数重载 函数重载是指在同一作用域内&#xff0c;可以有多个功能类似具有相同函数名&#xff0c;不同参数列表&#xff08;包括参数类型、参数个数、参数顺序&#xff09;的函数。编译器会根据函数调用时提供的参数来决定调用哪一个具体的函数。 注意&#xff1a;只…

QT gridlayout 循环设置组件,表格也通用 已解决

在需求中。经常遇到&#xff0c;表格 展示需求。 几乎都是json格式的。 // 列表配置文件QJsonArray listJsonArray getCfgJsonData("details_tab_table_config.json");if (listJsonArray.isEmpty()){return;}ui->gridWidget->setMaximumSize(QSize(310, 180)…

Vant Weapp小程序 van-uploader 文件上传点击无反应,删除无反应

Vant Weapp 1.0 版本开始支持van-uploader组件&#xff0c;请先确认好版本号和引用路径正确&#xff01;&#xff01; <van-uploader file-list"{{ fileList }}" deletable"{{ true }}" />1. 上传无反应 微信小程序用了van-uploader&#xff0c;但是…

第G5周:Pix2Pix理论与实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 一、背景知识 1.1 图像翻译 图像内容&#xff08;Image Content&#xff09;&#…

冒泡排序 快速排序 归并排序 其他排序

书接上回.. 目录 2.3 交换排序 2.3.1冒泡排序 2.3.2 快速排序 快速排序的优化: 快速排序非递归 2.4 归并排序 基本思想 归并排序非递归 海量数据的排序问题 排序算法时间空间复杂度和稳定性总结 四. 其他非基于比较排序 (了解) 2.3 交换排序 基本思想&#xff1a;…

[技术杂谈]解决windows上出现文件名太长错误

最近执行python setup.py install总是失败&#xff0c;提示文件名太长发现网上有取消限制文件名长度&#xff0c;测试发现改完注册表无需重启cmd就生效了。但是有时候会失败&#xff0c;现在方法放这。 转到Windows“开始”&#xff0c;然后键入REGEDIT。选择注册表编辑器 选…

淘宝app商品数据API接口|item_get_app-获得淘宝app商品详情原数据

获得淘宝app商品详情原数据 API返回值说明 item_get_app-获得淘宝app商品详情原数据 公共参数​​​​​​ 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地…

Linux离线安装mysql,node,forever

PS:本文是基于centos7实现的,要求系统能够查看ifconfig和unzip解压命令, 实现无网络可安装运行 首先现在百度网盘的离线文件包****安装Xftp 和 Xshell 把机房压缩包传到 home目录下****解压unzip 包名.zip 获取IP先获取到 linux 主机的ip ifconfig Xftp 连接输入IP,然后按照…

蓝牙信标定位精度

蓝牙信标定位精度受到多种因素的影响&#xff0c;包括设备硬件、环境因素以及信号干扰等。因此&#xff0c;蓝牙信标的精度并不是固定的&#xff0c;而是会在一定范围内波动。 在我们实际应用过程中&#xff0c;蓝牙信标的精度通常可以做到2-5米。本文重点介绍下影响蓝牙信标精…

StarRocks 助力小红书离线数仓提效,提升百倍回刷性能!

数据处理效率一直是大数据时代的核心话题&#xff0c;它推动着各类数据执行引擎持续迭代产品。从早期的 MapReduce&#xff0c;到今天的 Spark&#xff0c;各行业正不断演进其离线数仓技术架构。 现有以 Spark 为核心的数仓架构在处理大规模数据回刷方面已取得进展&#xff0c…

数组的概述

数组的概述 为什么需要数组 需求分析1&#xff1a; 需要统计某公司50个员工的工资情况&#xff0c;例如计算平均工资、找到最高工资等。用之前知识&#xff0c;首先需要声明50个变量来分别记录每位员工的工资&#xff0c;这样会很麻烦。因此我们可以将所有的数据全部存储到一…

day07-缓存商品、购物车

1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 结果&#xff1a; 系统响应慢、用户体验差 1.2 实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓…

vue脚手架创建项目:账号登录(利用element-ui快速开发)(取消eslint强制格式)(修改端口号)

新手看不懂&#xff0c;老手不用看系列 文章目录 一、准备工作1.1 取消强制格式检查1.2 导入依赖&#xff0c;注册依赖 二、去element-ui官网找样式写Login组件2.1 引用局部组件2.2 运行项目 三、看一下发现没问题&#xff0c;开始修改前端的代码四、修改端口号4.1 修改后端端口…

Michael.W基于Foundry精读Openzeppelin第52期——ERC4626.sol

Michael.W基于Foundry精读Openzeppelin第52期——ERC4626.sol 0. 版本0.1 ERC4626.sol 1. 目标合约2. 代码精读2.1 constructor()2.2 maxDeposit(address) && previewDeposit(uint256 assets) && deposit(uint256 assets, address receiver)2.3 maxMint(addres…

君正X2100 RTOS JPEG硬件编码

一、配置 进入SDK的tools/iconfigtool/IConfigToolApp目录&#xff0c;执行./IConfigTool指令&#xff0c;进入配置界面&#xff1a; Config.in 是生成配置界面的文件&#xff0c;Config是需要修改的配置文件&#xff0c;选择之后点击Open。 选择 xburst2系列CPU->X2000系列…

Harmony OS 网络编程 实验指南

netcat简介 netcat 是什么&#xff1f; netcat是一个非常强大的网络实用工具&#xff0c;可以用它来调试TCP/UDP应用程序&#xff1b; netcat 如何安装&#xff1f; Linux上可以使用发行版的包管理器安装&#xff0c;例如Debian/Ubuntu上&#xff1a; sudo apt-get instal…

别想宰我,怎么查看云厂商是否超卖?详解 cpu steal time

据说有些云厂商会超卖&#xff0c;宿主有 96 个核心&#xff0c;结果卖出去 100 多个 vCPU&#xff0c;如果这些虚机负载都不高&#xff0c;大家相安无事&#xff0c;如果这些虚机同时运行一些高负载的任务&#xff0c;相互之间就会抢占 CPU&#xff0c;对应用程序有较大影响&a…

缺省和重载。引用——初识c++

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 C输入&输出cout 和cin<<>> 缺省参数全缺省半缺省应用场景声明和定义分离的情况 函数重载1.参数的类型不同2.参数的个数不同3.参数的顺…

生成可读取配置文件的独立运行jar程序

前言: 周五刚躺下,前线打来语音要个下载文件的小程序,下载路径和下载码需要根据配置获取,程序需要在服务器执行。当然配置的设计是个人设计的,不然每次更新下载码都要重新出具jar包,太麻烦。多年没写独立运行的jar包了,翻阅了相关资料,最终还是功夫不负有心人。想着这种…