位运算技巧总结

一、常见位运算操作

1、基础位运算

&  按位与  有0则0

|   按位或  有1则1

^   按位异或  相同为0 不同为1

2、确定数n的二进制位中第x位是0还是1

目的:是0返回0,是1返回1

(n >> x) & 1

思路:1除了第一位其他位都是0,用&就可以消去其他位,n右移x位后,原来是0 & 1 = 0,1 & 1 = 1,得到结果不变,则答案成立

3、将数n的二进制的第x位改成1

目的:不能改变其他位

n |= (1 << x)

思路:不能改变除x位有两种做法:|= 0,&= 1,分别对应 (1 << x), ~(1 << x)

但是此题还要把x位改成1,x位只能选择 |= 1,综合来看是 |= (1 << x)

4、将数n的二进制的第x位改成0

目的:不能改变其他位

n &= (~(1 << x))

思路与3类似,不再重复

5、位图思想

int 有32位bit位,所以可以用0,1来表示一些特定的情况,32是容量大小,在一些题中可以用位图节省空间达到O(1)空间复杂度。

6、提取数n二进制中最右侧的1(lowbit)

目的:只留下最右边的1,其余都是0

n & (-n)

思路:首先-n二进制表示成三段。设lowbit下标是数n32位中二进制最右侧的1的下标

[lowbit + 1, 31]:-n取反n所有位

lowbit位:-n与n相同是1

[0, lowbit - 1]:-n与n相同是0

所以-n的本质是将n最右侧的1左边区域全部取反(不包括最右侧1)

所以取反必有0,lowbit右侧全是0,用&

7、消去数n的最右侧1

目的:其余位不变

n & (n - 1)

思路:n - 1本质将最右侧1的右边区域取反(包括1)

所以 [0, lowbit]:取反必有0,用&

[lowbit + 1, 31]:同为0或1,用&不影响

8、异或运算律

a ^ 0 = a

a ^ a = 0

(a ^ b) ^ c = a ^ (b ^ c)

二、例题

1、判断字符是否唯一

. - 力扣(LeetCode)

字母26个,用位图32位表示。0代表未出现过,1代表出现过

核心位运算:判断x位是0还是1,把x位由0变成1

2、丢失的数字

. - 力扣(LeetCode)

只能是0 ~ n里面丢失数字,可以利用下标异或

核心位运算:异或运算律

3、两整数之和

了解无进位加减如何达到加减数字目的,直到进位数是0才能停止相加

核心位运算:

无进位加:就是0 + 0 = 0,0 + 1 = 1,1 + 1 = 0,则用 a ^ b

得到进位:就是0 + 0 = 0,0 + 1 = 0,1 + 1 = 1,还要左移1位,则 (a & b) << 1

4、只出现一次的数字(二)

. - 力扣(LeetCode)

核心位运算:求第x位是0还是1,把第x位变成0,把第x位变成1

5、消失的两个数

(1)异或全部得到 ret

此时有两个不同的数会异或,其余数会被两两消去。

(2)找到 ret 的最右边1的 lowbit 位

我们最终的目的是把一组数分成两组,每组只有一个数的个数是1,那么我们一定要找出两个数的不同点,那就是 lowbit 位不同,那就是一个0,一个1。我们把 lowbit 位是0的放一组, lowbit 位是1的放一组,这样就分开了两个只出现一次的数。

(3)再次检测所有数的 lowbit 位是0还是1,相同进行异或

(4)返回两个数

核心位运算:异或运算律, 求第x位是0还是1

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

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

相关文章

Docker 部署 Kafka (图文并茂超详细)

部署 Kafka ( Docker ) Kafka对于zookeeper是强依赖&#xff0c;保存kafka相关的节点数据&#xff0c;所以安装Kafka之前必须先安装zookeeper [Step 1] : 部署 Zookeeper -> 拉取 Zookeeper 镜像 ➡️ 启动 Zookeeper 容器 docker pull zookeeper:3.4.14 docker run -d --…

Qt/C++编写的Onvif调试助手调试神器工具/支持云台控制/预置位设置等/有手机版本

一、功能特点 广播搜索设备&#xff0c;支持IPC和NVR&#xff0c;依次返回。可选择不同的网卡IP进行对应网段设备的搜索。依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。可对指定的Profile获取视频流Rtsp地址&#xff0c;比如主码流地址、子码流地址。可对每个设备设…

matlab读取NC文件(含group)

matlab读取NC文件&#xff08;含group&#xff09;&#xff1a; NC文件数据结构&#xff1a; 代码&#xff1a; % 打开 NetCDF 文件 filename your_file.nc; % 替换为你的文件名% 使用 netcdf.open 函数打开文件 ncid netcdf.open(filename, NC_NOWRITE);% 查看文件中的组 …

手把手教你使用亚马逊云服务器创建EC2实例

陈老老老板&#x1f934; &#x1f9d9;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f9d9;‍♂️本文简述&#xff1a;如何使用亚马逊云服务器创建EC2实例。 &#x1f9d9;‍♂…

钢琴灯哪个牌子好?五款学生钢琴灯测评

在这个快节奏的时代&#xff0c;孩子们都面临着长时间用眼的问题&#xff0c;而长时间处于室内不良的光线环境很容易对孩子的视力健康产生影响&#xff0c;对于目前有娃的家庭&#xff0c;很多家长都在给孩子寻找可以提高室内光学环境的钢琴灯&#xff0c;钢琴灯作为一种通过专…

【分支-快速排序】

【分支-快速排序】 1. 颜色分类1.1 题目来源1.2 题目描述1.3 题目解析 2. 排序数组2.1 题目来源2.2 题目描述2.3 题目解析 3. 数组中的第K个最大元素3.1 题目来源3.2 题目描述3.3 题目解析 4. 库存管理 III4.1 题目来源4.2 题目描述4 .3 题目解析 1. 颜色分类 1.1 题目来源 7…

如何使用QT完成记事本程序的UI界面布局

每日QT技巧查询表-CSDN博客 会持续更新记事本编写的全部过程&#xff0c;关注不迷路 一、相关控件 ①水平和垂直布局 ②按键 ③文本框 ④水平弹簧 ⑤标签 ⑥Widget 二、控件使用方法 1、PushButton 拖出三个按键&#xff0c;并对其进行命名&#xff0c;两处地方命名可以不一…

数据结构——线性表(顺序存储结构和单链表结构)

线性表的定义 线性表&#xff08;List&#xff09;&#xff1a;由零个或多个数据元素组成的有限序列。 &#xff08;1&#xff09;它是一个序列&#xff0c;也就是元素之间有个先来后到的&#xff1b; &#xff08;2&#xff09;若元素有多个&#xff0c;则第一个元素无前驱…

[数据集][目标检测]人脸口罩佩戴目标检测数据集VOC+YOLO格式8068张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8068 标注数量(xml文件个数)&#xff1a;8068 标注数量(txt文件个数)&#xff1a;8068 标注…

Spring Boot实现文件上传和下载

1.背景 项目中经常会有上传和下载的需求&#xff0c;这篇文章简述一下springboot项目中实现简单的上传和下载。 2.代码工程 实验目标 实现简单的文件上传和下载 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://…

JDBC:连接数据库

文章目录 报错 报错 Exception in thread “main” java.sql.SQLException: Can not issue SELECT via executeUpdate(). 最后这里输出的还是地址&#xff0c;就是要重写toString()方法&#xff0c;但是我现在还不知道怎么写 修改完的代码&#xff0c;但是数据库显示&#…

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标…

第三次去银行办事,核心是犯了抓不住重点这个毛病

手机银行不小心输错了两次密码&#xff0c;然后就限制了交易&#xff0c;只能在柜台操作。 由此引发了比如提示密码错误、定期转活期、转账等功能的异常。 前两次去银行&#xff0c;竟然只是去解决了这些附带问题。 核心问题是限制非柜面交易啊。 哎 这就是抓不住重点&…

2024年9月最新界面:自己如何在电脑上注册新的Google谷歌账号,图文详解和关键点解析、常见问题

有一些朋友需要通过谷歌账号来工作、学习或娱乐&#xff08;例如很多游戏需要用谷歌账号来注册和使用&#xff09;&#xff0c;但是不知道如何注册谷歌账号&#xff0c;或者知道如何注册&#xff0c;但是对于一些步骤或者注意事项不太熟悉&#xff0c;导致注册不成功&#xff0…

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配&#xff08;Exact Match&#xff09;2. 正则表达式匹配&#xff08;Regex Match&#xff09;3. 前缀匹配&#xff08;Prefix Match&#xff09; 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中&#xff0…

证书学习(四)X.509数字证书整理

目录 一、X.509证书 介绍1.1 什么是 X.509证书?1.2 什么是 X.509标准?1.3 什么是 PKI?二、X.509证书 工作原理2.1 PKI 的基础——加密算法2.2 PKI 证书编码三、X.509证书 结构3.1 证书字段3.2 证书扩展背景: 我们在日常的开发过程中,经常会遇到各种各样的电子证书文件,其…

Ubuntu: 配置OpenCV环境

从从Ubuntu系统安装opencv_ubuntu安装opencv-CSDN博客文章浏览阅读2.3k次&#xff0c;点赞4次&#xff0c;收藏14次。开源计算机视觉(OpenCV)是一个主要针对实时计算机视觉的编程函数库。OpenCV的应用领域包括:2D和3D功能工具包、运动估计、面部识别系统、手势识别、人机交互、…

vue通过html2canvas+jspdf生成PDF问题全解(水印,分页,截断,多页,黑屏,空白,附源码)

前端导出PDF的方法不多&#xff0c;常见的就是利用canvas画布渲染&#xff0c;再结合jspdf导出PDF文件&#xff0c;代码也不复杂&#xff0c;网上的代码基本都可以拿来即用。 如果不是特别追求完美的情况下&#xff0c;或者导出PDF内容单页的话&#xff0c;那么基本上也就满足业…

ChatGPT+Simple Mind Map生成思维导图:快速提升学习效率

一、告别杂乱笔记&#xff0c;一键生成清晰思维导图&#xff01; 最近开始学习网络安全&#xff0c;一头扎进了各种协议、漏洞、防御机制的海洋中。信息量巨大&#xff0c;知识点零散&#xff0c;让我很快便陷入了“知识焦虑”——笔记越记越多&#xff0c;却越来越混乱&#…

第50课 Scratch入门篇:放烟花

放烟花 故事背景: 水在一个宁静的小镇上,生活着一位充满好奇心和创造力的小朋友。   有一天晚上,小镇的天空格外黑暗,星星也躲在了云层后面。小朋友望着黑漆漆的夜空,心想:要是能有一场绚丽的烟花表演,那该多好啊!于是,他决定用自己所学的 Scratch 编程知识来创造一…