算法笔记~—位运算

 

目录

常见位运算:

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,将问题降级为仅有两个仅出现一次的数字。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网上国网App启动鸿蒙原生应用开发,鸿蒙开发前景怎么样?

从华为宣布全面启动鸿蒙生态原生应用一来&#xff0c;各种各样的新闻就没有停过&#xff0c;如&#xff1a;阿里、京东、小红书……等大厂的加入&#xff0c;而这次他们又与一个国企大厂进行合作&#xff1a; 作为特大型国有重点骨干企业&#xff0c;国家电网承担着保障安全、经…

GAMES Webinar 288-VR/AR专题-陆峰-混合现实中的多模态自然人机交互

感知交互增强智能 研究室虚拟现实技术与系统国家重点实验室&#xff0c;北京航空航天大学计算医学研究所&#xff0c;大数据精准医疗北京市高精尖创新中心 Perception & Hybrid Interaction (PHI) for Augmented & Affective Intelligence (A2I) We are working on v…

voxelize_cuda安装教程 python+windows环境

import voxelize_cuda报错 安装步骤&#xff1a; 克隆voxelize项目 官网&#xff1a;https://github.com/YuliangXiu/neural_voxelization_layer.git git clone https://github.com/YuliangXiu/neural_voxelization_layer.git下载一些必备的解析c文件的依赖 官网&#xff1a…

ES6 基础

文章目录 1. 初识 ES62. let 声明变量3. const 声明常量4. 解构赋值 1. 初识 ES6 ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff0c;是使得」JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为…

蓝牙HFP协议推荐的语音丢包补偿算法浮点实现的定点化

最近在做蓝牙的宽带语音通话。相对于蓝牙窄带语音&#xff0c;主要变化是把采样率从8k变到16k&#xff0c;以及编解码器从CVSD变成mSBC&#xff08;modified SBC&#xff0c;改进的SBC&#xff09;等。蓝牙语音通话相关的HFP&#xff08;Hand Free Profile&#xff09;强烈建议…

【线段树】第十三届蓝桥杯省赛C++ A组 Java C组 Python A组/B组《最长不下降子序列》(C++)

【题目描述】 给定一个长度为 N 的整数序列&#xff1a;,,⋅⋅⋅,。 现在你有一次机会&#xff0c;将其中连续的 K 个数修改成任意一个相同值。 请你计算如何修改可以使修改后的数列的最长不下降子序列最长&#xff0c;请输出这个最长的长度。 最长不下降子序列是指序列中的…

报道 | 2024年4月-2024年6月国际运筹优化会议汇总

封面图来源&#xff1a; https://www.pexels.com/zh-cn/photo/1181406/ 2023年2月-2024年6月召开会议汇总&#xff1a; The 24th European Conference on Evolutionary Computation in Combinatorial Optimisation (EvoCOP) Location: Aberystwyth, Wales, UK Important Date…

鸿蒙HarmonyOS应用开发——组件级配置

在开发应用时&#xff0c;需要配置应用的一些标签&#xff0c;例如应用的包名、图标等标识特征的属性。本文描述了在开发应用需要配置的一些关键标签。 应用包名配置 应用需要在工程的AppScope目录下的 app.json5配置文件 中配置bundleName标签&#xff0c;该标签用于标识应用…

STM32F4x7标准库带操作系统移植LWIP

上一篇解读了使用STM的标准库&#xff0c;移植不带操作系统版本的LWIP。 这里再梳理一下&#xff0c;带操作系统版本的差异。 main()函数 初始化部分跟之前的基本相同。 不同的是&#xff0c;不需要在主循环里调用LwIP_Periodic_Handle(LocalTime); LWIP驱动 ethernetif.c要…

React项目打包优化-包体积分析

1、什么是包体积分析&#xff1f; 通过可视化的方式&#xff0c;直观的看到各种包打包之后的体积大小&#xff0c;方便后续针对体积情况做优化 2、怎么分析包&#xff1f; 借助插件 source-map-explorer&#xff0c; 1、先安装插件 npm install source-map-explorer 2、在p…

代码随想录刷题day35|柠檬水找零根据身高重建队列最少的箭引爆气球

文章目录 day35学习内容一、柠檬水找零1.1、思路1.2、代码-正确写法 二、根据身高重建队列2.1、思路2.2、正确写法12.2.1、 如何理解上面这段代码2.2.2、 如何理解 que.add(p[1], p)&#xff1f;2.2.3、这段代码贪心在哪里呢&#xff1f; 三、最少的箭引爆气球3.1、思路3.2、正…

YOLOv5s处理二维牙齿数据集

一、网络结构 二、输入输出 1、输入 640x640的图像 2、输出 权重文件 测试图像 三、数据预处理 在github上下载YOLOv5的模型&#xff0c;并安装模型所需环境 pip install -U -r requirements.txt 四、训练&测试 对数据集进行训练 python train.py --img 640 --batc…

mybatis 实验报告1

文章目录 新建数据库新建项目&#xff0c;并导入jar包添加配置文件conf.xml定义实体类定义操作表user的sql的映射文件 userMapper.xml注册&#xff1a;将mapper.xml文件注册到conf.xml配置文件中一共6步&#xff0c;这个只是测试类&#xff0c;这个不算 新建数据库 命名是 随便…

4、事件修饰符、过滤器、自定义指令、生命周期

一、事件修饰符 按键别名enter 回车 delete 删除键 esc取消键 space 空格键 <script> export default {name: "KeyUp",methods:{keyUp(e){ console.log(e) }},skip(){window.location.href "http:www.xx.com"} } </script> <template>…

BUUCTF-Misc14

[WUSTCTF2020]find_me1 1.打开附件 是一个学校的校徽 2.盲文解密 发现图片属性里的备注是一串盲文 用在线盲文解密 3.得到flag

第三十一天-Flask-ORM-sqlalchemy

目录 1.什么是ORM 2.flask-sqlalchemy 1安装 2.配置 3.数据库模型设计 ​编辑 4.插入修改删除 5.查询 1.什么是ORM 2.flask-sqlalchemy 1安装 2.配置 3.数据库模型设计 4.插入修改删除 5.查询

001_Python(PyCharm,Anaconda,Jupyter更改工作目录)

# 整理笔记&#xff0c;记录一下Python学习过程&#xff0c;希望对像我一样的初学者有所帮助&#xff01; 一、Python三个基本概念 1、解释器 Python解释器&#xff0c;是将高级语言解析为二进制机器语言的工具。 通常说的安装python就是指安装python解释器。 目前最新的P…

基于springboot+vue调用百度ai实现车牌号识别功能

百度车牌号识别官方文档 结果视频演示 后端代码 private String getCarNumber(String imagePath, int count) {// 请求urlString url "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate";try {byte[] imgData FileUtil.readFileByBytes(imagePath);Stri…

【如何安装odl: 1.0.0.dev0】

【如何安装odl: 1.0.0.dev0】 ODL官网 pip install odl可能容易报错&#xff0c;建议使用下述命令安装 pip install https://github.com/odlgroup/odl/archive/master.zip检查是否安装成功 conda list

练习二 霍格沃兹登录页面

1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>教务系统管理页面</title><link rel"stylesheet" href"./教务管路系统页面.css"> </head> <body&g…