算法笔记~—位运算

news/2024/4/27 20:38:51/文章来源:https://blog.csdn.net/weixin_50470247/article/details/136966478

 

目录

常见位运算:

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.luyixian.cn/news_show_1028201.aspx

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

相关文章

Qt扫盲-QAssisant 集成其他qch帮助文档

QAssisant 集成其他qch帮助文档 一、概述二、Cmake qch例子1. 下载 Cmake.qch2. 添加qch1. 直接放置于Qt 帮助的目录下2. 在 QAssisant中添加 一、概述 QAssisant是一个很好的帮助文档&#xff0c;他提供了供我们在外部添加新的 qch帮助文档的功能接口&#xff0c;一般有两中添…

百度智能云千帆,产业创新新引擎

本文整理自 3 月 21 日百度副总裁谢广军的主题演讲《百度智能云千帆&#xff0c;产业创新新引擎》。 各位领导、来宾、媒体朋友们&#xff0c;大家上午好。很高兴今天在石景山首钢园&#xff0c;和大家一起沟通和探讨大模型的发展趋势&#xff0c;以及百度最近一段时间的思考和…

为什么Python不适合写游戏?

知乎上有热门个问题&#xff1a;Python 能写游戏吗&#xff1f;有没有什么开源项目&#xff1f; Python可以开发游戏&#xff0c;但不是好的选择 Python作为脚本语言&#xff0c;一般很少用来开发游戏&#xff0c;但也有不少大型游戏有Python的身影&#xff0c;比如&#xff1…

sheng的学习笔记-AI-人脸识别

目录:sheng的学习笔记-AI目录-CSDN博客 需要学习卷机神经网络等知识&#xff0c;见ai目录 目录 基础知识&#xff1a; 人脸验证&#xff08;face verification&#xff09; 人脸识别&#xff08;face recognition&#xff09; One-Shot学习&#xff08;One-shot learning&…

PTA-练习8

目录 实验5-3 使用函数求Fibonacci数 实验5-4 输出每个月的天数 实验5-9 使用函数求余弦函数的近似值 实验5-11 空心的数字金字塔 实验6-6 使用函数验证哥德巴赫猜想 实验6-7 使用函数输出一个整数的逆序数 实验6-8 使用函数输出指定范围内的完数 实验8-1-7 数组循环右…

Transformer的前世今生 day11(Transformer的流程)

Transformer的流程 在机器翻译任务中&#xff0c;翻译第一个词&#xff0c;Transformer的流程为&#xff1a; 先将要翻译的句子&#xff0c;一个词一个词的转换为词向量送入编码器层&#xff0c;得到优化过的词向量以及K、V&#xff0c;将K、V送入解码器层&#xff0c;并跟解码…

halcon例程学习——ball.hdev

dev_update_window (off) dev_close_window () dev_open_window (0, 0, 728, 512, black, WindowID) read_image (Bond, die/die_03) dev_display (Bond) set_display_font (WindowID, 14, mono, true, false) *自带的 提示继续 disp_continue_message (WindowID, black, true)…

android studio忽略文件

右键文件&#xff0c;然后忽略&#xff0c;就不会出现在commit里面了 然后提交忽略文件即可

Vue3 + Vite + TS + Element-Plus + Pinia项目(5)对axios进行封装

1、在src文件夹下新建config文件夹后&#xff0c;新建baseURL.ts文件&#xff0c;用来配置http主链接 2、在src文件夹下新建http文件夹后&#xff0c;新建request.ts文件&#xff0c;内容如下 import axios from "axios" import { ElMessage } from element-plus im…

【C++的奇迹之旅】C++关键字命名空间使用的三种方式C++输入输出命名空间std的使用惯例

文章目录 &#x1f4dd;前言&#x1f320; C关键字(C98)&#x1f309; 命名空间&#x1f320;命名空间定义&#x1f309;命名空间使用 &#x1f320;命名空间的使用有三种方式&#xff1a;&#x1f309;加命名空间名称及作用域限定符&#x1f320;使用using将命名空间中某个成员…

【JVM】Java类加载器 和 双亲委派机制

1、java类加载器的分类 JDK8及之前 启动类加载器&#xff0c;BootStrap Class Loader,加载核心类,加载jre/lib目录下的类&#xff0c;C实现的拓展类加载器&#xff0c; Extension Class Loader&#xff0c;加载java拓展类库&#xff0c;jre/lib/ext目录下&#xff0c;比如javax…

蓝桥杯 java 凑算式 16年省赛Java组真题

题目 思路&#xff1a; 求有多少种解法 比如:68/3952/714就是一种解法&#xff0c;53/1972/486 是另一种解法 8/3952/714是可以除尽的 但是后面一个不行 所以我们也要通分 代码&#xff1a; public class 凑算式 {static int[] a {1, 2, 3, 4, 5, 6, 7, 8, 9};static int c…

SpringBoot Redis的使用

官方文档&#xff1a; 官方文档&#xff1a;Spring Data Redis :: Spring Data Redis 和jedis一样&#xff0c;SpringBoot Redis 也可以让我在Java代码中使用redis&#xff0c;同样也是通过引入maven依赖的形式。 加速访问github: 使用steam可以免费加速访问github Spring…

鸿蒙OS开发实例:【页面传值跳转】

介绍 本篇主要介绍如何在HarmonyOS中&#xff0c;在页面跳转之间如何传值 HarmonyOS 的页面指的是带有Entry装饰器的文件&#xff0c;其不能独自存在&#xff0c;必须依赖UIAbility这样的组件容器 如下是官方关于State模型开发模式下的应用包结构示意图&#xff0c;Page就是…

设计模式之单例模式精讲

UML图&#xff1a; 静态私有变量&#xff08;即常量&#xff09;保存单例对象&#xff0c;防止使用过程中重新赋值&#xff0c;破坏单例。私有化构造方法&#xff0c;防止外部创建新的对象&#xff0c;破坏单例。静态公共getInstance方法&#xff0c;作为唯一获取单例对象的入口…

ClickHouse 面试题及答案整理,最新面试题

ClickHouse的数据分布式存储机制是如何设计的&#xff1f; ClickHouse的数据分布式存储机制设计包括以下几个方面&#xff1a; 1、分片和复制&#xff1a; ClickHouse通过分片将数据水平划分为多个部分&#xff0c;每个部分存储在不同的节点上。每个分片可以有一个或多个副本…

macOS Sonoma 14.4.1 (23E224) 正式版发布,ISO、IPSW、PKG 下载

macOS Sonoma 14.4.1 (23E224) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 2024 年 3 月 26 日凌晨&#xff0c;macOS Sonoma 14.4.1 更新修复了一个可能导致连接到外部显示器的 USB 集线器无法被识别的问题。它还解决了可能导致 Java 应用程序意外退出的问题&#xff0c;并修…

基于单片机音乐喷泉制作设计资料

**单片机设计介绍&#xff0c;基于单片机音乐喷泉制作设计资料 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机音乐喷泉制作设计资料概要主要包括以下几个关键部分&#xff1a;系统概述、硬件设计、软件设计以及实现过…

JavaScript高级 —— 学习(一)

目录 一、作用域 &#xff08;一&#xff09;局部作用域 1.函数作用域 2.块作用域 &#xff08;二&#xff09;全局作用域 二、垃圾回收机制 GC &#xff08;一&#xff09;生命周期 1.内存分配 2.内存使用 3.内存回收 4.特殊情况——内存泄漏&#xff1a; 注意&…

基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用

基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍基于STC12C5A60S2系列1T 8051单片机通过单个按…