算法笔记~—位运算

news2024/11/13 13:20:32

 

目录

常见位运算:

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.coloradmin.cn/o/1546405.html

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

相关文章

Focal Modulation Networks聚焦调制网络

摘要 我们提出了 焦点调制网络 &#xff08;简称 FocalNets) &#xff0c;其中 自注意&#xff08; SA &#xff09;被 Focal Modulation 替换&#xff0c;这种机制 包括三个组件&#xff1a;&#xff08; 1 &#xff09;通过 depth-wise Conv 提取分级的上下文信息&#xff0…

latex报错Undefined control sequence.

这里写目录标题 1. 错误原因2. 进行改正3. 爱思唯尔期刊与施普林格期刊对于算法的格式不太一样&#xff0c;不能直接套用总结---在LaTeX中&#xff0c;使用algorithm环境排版算法时&#xff0c;有一些格式注意事项 1. 错误原因 我在算法中使用\Require 2. 进行改正 换成\REQ…

YOLOv9改进策略:注意力机制 | 动态稀疏注意力的双层路由方法BiLevelRoutingAttention | CVPR2023

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; CVPR2023 动态稀疏注意力的双层路由方法BiLevelRoutingAttention&#xff0c;强烈推荐&#xff0c;涨点很不错&#xff0c;同时被各个领域的魔改次数甚多&#xff0c;侧面验证了性能。 &#x1f4a1;&#x1…

vue项目在本地源码方式启动和打包之后在nginx中代理有什么不同

Vue项目在本地源码方式启动和打包之后在Nginx中代理的主要区别在于开发环境与生产环境的配置、性能优化、安全性和部署流程等方面。以下是一些具体的差异点&#xff1a; 开发环境与生产环境&#xff1a; 本地源码启动通常是在开发环境中&#xff0c;使用Vue CLI的vue-cli-servi…

C++基础之继承续(十六)

一.基类与派生类之间的转换 可以把派生类赋值给基类可以把基类引用绑定派生类对象可以把基类指针指向派生类对象 #include <iostream>using std::cin; using std::cout; using std::endl;//基类与派生类相互转化 class Base { private:int _x; public:Base(int x0):_x(…

【Java多线程(2)】Thread常见方法和线程状态

目录 一、Thread类及常见方法 1. join() 等待一个线程 2. currentThread() 获取当前线程引用 3. sleep() 休眠当前线程 二、线程的状态 1. 线程的所有状态 2. 状态转移 一、Thread类及常见方法 接上文&#xff1a;多线程&#xff08;1&#xff09;http://t.csdnimg.cn/…

Docker 【安装MongoDB】

文章目录 前言一、安装二、使用1. 通过权限认证的方式登入2. 基础操作 前言 MongoDB是一个非关系型数据库&#xff0c;它主要的应用场景有这些 相比mysql&#xff0c;MongoDB没有事务&#xff0c;索引之类的东西。最小单位是文档。 可能有人说&#xff0c;为什么这个场景我要…

【无标题】如何使用 MuLogin 设置代理

如何使用 MuLogin 设置代理 使用 MuLogin 浏览器设置我们的代理&#xff0c;轻松管理多个社交媒体或电子商务帐户。 什么是MuLogin&#xff1f; MuLogin 是一款虚拟反检测浏览器&#xff0c;使用户能够管理多个电子商务、社交媒体和广告帐户&#xff0c;而无需验证码或 IP 禁…

canvas画带透明度的直线和涂鸦

提示&#xff1a;canvas画线 文章目录 前言一、带透明度的直线和涂鸦总结 前言 一、带透明度的直线和涂鸦 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…

Chrome浏览器修改网页内容

方法一&#xff1a;使用开发者工具 在Chrome浏览器中打开要修改的网页。按下F12键打开开发者工具。在开发者工具窗口中&#xff0c;找到“Elements”标签页。在“Elements”标签页中&#xff0c;找到要修改的网页元素。双击要修改的网页元素&#xff0c;即可进行编辑。 方法二…

轻松掌握:使用 API 接口自动缩短网址的秘诀

在互联网的世界里&#xff0c;网址缩短已经成为了一种时尚和必要。长而复杂的网址不仅难以记忆&#xff0c;还可能让人望而却步。但是&#xff0c;现在有了 API 接口&#xff0c;我们可以轻松地将网址自动缩短&#xff0c;让分享变得更加简单和高效&#xff01;本文将以具体例子…

Protocol Buffers设计要点

概述 一种开源跨平台的序列化结构化数据的协议。可用于存储数据或在网络上进行数据通信。它提供了用于描述数据结构的接口描述语言&#xff08;IDL&#xff09;&#xff0c;也提供了根据 IDL 产生代码的程序工具。Protocol Buffers的设计目标是简单和性能&#xff0c;所以与 XM…

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

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

Redis 之死:Garantia Data 如何策划了开源史上最大劫案?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Temple of Doom靶场nodejs获取shellss-manager漏洞tcpdump提权

下载链接&#xff1a; Temple of Doom: 1 ~ VulnHub 下载完成后直接在vxbox中导入即可&#xff0c;网络链接模式根据自身情况而定&#xff08;我采用的桥接模式&#xff09; 正文&#xff1a; 先用nmap进行扫描靶机ip nmap -sn 192.168.1.1/24 对192.168.1.5进行端口探测&a…

Spring学习——什么是循环依赖及其解决方式

文章目录 前言一、什么是循环依赖二、解决思路1、循环依赖分类2、对象初始化步骤及对象分类3、spring是如何解决的4、图解5、三级缓存1、区别2、ObjectFactory是什么 三、源码debug1、spring创建对象过程1、dubug第一步——找到getBean2、dubug第二步——getBean与doGetBean3、…

基于AT89C51单片机的智能交通灯设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/89035863?spm1001.2014.3001.5503 1绪 论 1.1课题研究背景 交通是城市经济活动的命脉&#xff0c;对城市经济发展、人民生活水平的提高起着十分重要的作用。城市交…

用 C++ 编码架构图的最佳用例

统一建模语言&#xff08;UML&#xff09;&#xff0c;作为一种实际应用的语言标准&#xff0c;借助一系列架构图呈现建模软件系统。UML 的出现鼓励了自动化软件工具的开发&#xff0c;有助于自动代码生成。UML 图面向对象系统和软件工具&#xff0c;将静态结构和动态行为以可视…

如何统计代码量

工具&#xff1a; cloc 下载地址&#xff1a; Releases AlDanial/cloc GitHub 使用方法&#xff1a;

2024.3.26

实现闹钟 weiget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimer> #include<QTime> #include<QTimerEvent> #include<QString> #include<QtTextToSpeech> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } Q…