【C++】位运算

news2025/1/11 4:55:38

目录

位运算概述

 位运算常见操作

判断字符是否唯一

算法思路

代码实现

丢失的数字

算法思想

代码实现

两整数之和

算法思路

代码实现

只出现一次的数字

算法思路

代码实现

消失的两个数字

算法思想

代码实现


位运算概述

在计算机中我们知道数据在内存中都是以二进制的形式储存的,位运算是直接对整形的二进制进行的操作,这样可以可以使程序的效率更高,性能更好。

 位运算常见操作

 这些是常用的位运算操作符,需要明确记忆;

我们通常将整形的二进制数看成一个数组,对右边的位置的下标是0,最左边的下标是31;这样方便移动操作。(比如右移2位,就>>2,就是下标位2的位置)。


下面是一些常见对数的位运算操作:
1.给一个数,判断它的二进制表示中的第x位是0还是1;

先右移x位,就到了x位上,然后&1,如果是1那就是1,如果是0,结果就是0;就是(n>>x)&1;

2.给一个数n的二进制表示的第X位修改成1:

那修改之前第X位就是0;先右移,然后直接对X位进行|(按位或),0|1=1;就是(n>>x)|1;

3.将一个数的n的二进制表示的第X位修改成0:

上面我们说了0&1=0,那我们就只把第X位&0即可,我们通常是(n>>x)&(~1),对1取反,这样只有第x位&0,其他位都&1,如果其他位是1的话,操作后还是1,是0还是0。因此对其他位没有影响。

4. 位图思想

我们可以使用一个整形变量的比特位来记录二进制数信息。

5.提取一个树n二进制数最右侧的1(lowbit)

直接&上相反数即可。因为整形的负数的二进制数是对正数的二进制数取反加一(先取反,所有的位数都不相同,+1后会发生进位,然后负数最右侧的1的左侧与正数相反,右侧与正数相同,都是0),然后&就会得到最右侧的1;可以画图试试。

6.干掉一个数n的最右侧的1:

直接n&(n-1),n-1会发生向高位借位,所以最右侧的1会被借走,这个位置的左侧不变,后侧全部反过来了,然后&,就把1干掉了。

7.异或(^):消消乐  a^a=0;能用异或解决的题,都非常的巧妙。

下面来看几道例题;

判断字符是否唯一

地址:. - 力扣(LeetCode)

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

示例 1:

输入: s = "leetcode"
输出: false 

示例 2:

输入: s = "abc"
输出: true

限制:

  • 0 <= len(s) <= 100
  • s[i]仅包含小写字母
  • 如果你不使用额外的数据结构,会很加分。

算法思路

我们首先会想到哈希表来解决这道题,当然也是可以的,不过我们使用位图的思想,开销会更小,首先定义tmp变量,来储存数(把字母转化为1-26),如果位置上是0说明第一次出现,如果位置上是1,又出现了一次说明该数不是唯一的。

代码实现

class Solution {
public:
    bool isUnique(string astr) {
        //如果字符串的长度大于26那么必定是有重复的
        if(astr.size()>26)return false;
        //使用位图的思想
        int tmp=0;
        for(auto ch:astr)
        {
            //对应字符对应的位置
            int i=ch-'a';
            //判断是否位置上已经存在
            if((tmp>>i)&1==1)return false;
            //如果没有存在就把对应的字符位置处理
            tmp=tmp|(1<<i);
        }
        return true;
    }
};

丢失的数字

地址:. - 力扣(LeetCode)

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

示例 1:

输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 2:

输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 3:

输入:nums = [9,6,4,2,3,5,7,0,1]
输出:8
解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

算法思想

直接使用异或,全部的数字是0到nums.size();将全部的数字和数组中的都异或一次,就转化成了单身狗的问题了。

代码实现

class Solution {
public:
    int missingNumber(vector<int>& nums) {
       int ret=0;
       int n=nums.size();
       for(int i=0;i<=n;i++)
       ret^=i;
       for(auto x:nums)ret^=x;
       return ret;
    }
};

两整数之和

地址:. - 力扣(LeetCode)

给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。

示例 1:

输入:a = 1, b = 2
输出:3

示例 2:

输入:a = 2, b = 3
输出:5

算法思路

多次使用异或和按位与,我们异或两个数可以发现可以起到类似相加的效果,但是不会进位,因此,我们需要异或后然后异或加上进位,那么进位怎么来呢,1和1才产生进位,因此我们把两个数a,b按位与,就得到了进位的二进制,还需要将1左移,因为要进到前面的高位,然后异或上刚才无进位相加的结果,循环此操作,直到进位数为0;

代码实现

class Solution {
public:
    int getSum(int a, int b) {
        while(b)
        {
            int ret=a^b;
            int carry=(a&b)<<1;
            a=ret;
            b=carry;
        }
        return a;
    }
};

只出现一次的数字

地址:. - 力扣(LeetCode)

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法(O(N))且使用常数级空间(O(1))来解决此问题。

示例 1:

输入:nums = [2,2,3,2]
输出:3

示例 2:

输入:nums = [0,1,0,1,0,1,99]
输出:99

算法思路

使用位图的思想,比特位上存储的是对应位上出现的1的个数,我们通过%3,就可以去除出现三次的数的影响,只留下了出现一次的数。(示例一为例)

代码实现

class Solution {
public:
    int singleNumber(vector<int>& nums) {
            int ret=0;
            for(int i=0;i<32;i++)
            {
                int sum=0;
                for(auto& e:nums)
                {
                    if(((e>>i)&1)==1)sum++;//统计这一位上的和
                    sum%=3;
                }
                 if(sum==1)ret|=1<<i;
            }
            return ret;
    }
};

消失的两个数字

地址:. - 力扣(LeetCode)

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?

以任意顺序返回这两个数字均可。

示例 1:

输入: [1]
输出: [2,3]

示例 2:

输入: [2,3]
输出: [1,4]

算法思想

首先,将所有的数和数组中的数全部异或,结果就是缺失的两个数的异或sum,我们接下来要做的就是分开他俩,那就要先找到有什么不同,因为两个数值不同,所以异或后必定会有1,我们就找sum二进制中1出现的位置,这个位置是0和1异或而成,我们默认0是a,1是b,接下来就遍历所有数和数组中的数,如果这个位置diff,出现的是0就把这个数跟a异或,反之就跟b异或,结束后a是一堆出现了两次的数和a的异或,出现两次的都会被抵消掉,只剩下a;另一组只剩下b;

代码实现

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int n=nums.size();
        int sum=0;
        for(auto x:nums)sum^=x;
        for(int i=1;i<=n+2;i++)
        sum^=i;//得到两个缺失的数的异或
        //进行分离-->找出一个不同的数位
        int diff=0;
        while(1)
        {
            if((sum>>diff)&1==1)break;
            else
            diff++;
        }
        int a=0;int b=0;
        //根据这个数位把两个熟分开
        for(int i=1;i<=(n+2);i++)
        {
            if((i>>diff)&1==1)a^=i;//这个数位为1的与a异或
            else
            b^=i;
        }
        for(auto x:nums)
        {
            if((x>>diff)&1==1)a^=x;
            else
            b^=x;
        }
        return{a,b};
    }
};

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

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

相关文章

科创微应用平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;场地信息管理&#xff0c;场地类型管理&#xff0c;预约参观管理&#xff0c;场地预约管理&#xff0c;活动信息订单&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首…

为具有公网IPV6地址的服务器安装nextcloudAIO并使用NginxProxyManager配置反向代理

软件和硬件环境 ubuntu server 24.04&#xff0c;并已配置好ipv6公网地址&#xff0c;已安装好docker和docker-compose。一块单独的硬盘&#xff0c;用于单独存储nextcloud数据。&#xff08;非必需&#xff09;有一个能够正常解析的域名&#xff0c;并已配置好AAAA记录解析。…

windows下wsl ubuntu 搭建深度学习环境

wsl安装ubuntu 删除之前安装的ubuntu; 查看都安装了哪些版本: wsl -l -v 删除想要删除的版本: wsl --unregister ${名字} 删除之后 ubuntu.exe的安装包还在c盘中, 找到它, 并将 ubuntu.exe的所在文件夹的所有文件都复制到你想要安装的新的路径下, 比如我在E盘新创建一个文…

ARM高性能计算(HPC)处理器Neoverse介绍

思考: Neoverse系列中的N、V、E有什么区别? 这三个字母的缩写又是什么? ARM Neoverse架构是ARM专为服务器、数据中心、高性能计算(HPC)和网络基础设施设计的一系列处理器架构。Neoverse架构分为N系列、V系列和E系列,这些系列面向不同的应用场景,各自有不同的设计目标和…

Hackademic.RTB1靶场实战【超详细】

靶机下载链接&#xff1a;https://download.vulnhub.com/hackademic/Hackademic.RTB1.zip 一、主机探测和端口扫描 nmap 192.168.121.0/24 ip:192.168.121.196 端口:22、80 二、访问80端口 发现target可点击 点击后跳转&#xff0c;页面提示目标是读取到 key.txt 文件 fin…

5.mysql多表查询

MYSQL多表查询 MYSQL多表查询1.多表关系笛卡尔积 2. 多表查询概述2.1 内连接2.2 外连接2.3自连接联合查询union &#xff0c;union all 2.4子查询2.4.1标量子查询2.4.2列子查询2.4.3行子查询2.4.4表子查询 MYSQL多表查询 create table student(id int auto_increment primary …

CMU15445 (Fall 2023) Project2 - EXTENDIBLE HASH INDEX 思路分享

文章目录 Task 1 - Read/Write Page GuardsPageGuard函数实现移动构造函数移动赋值函数UpgradeRead/UpgradeWriteDrop析构函数BufferPoolManager函数实现FetchPageBasicFetchPageRead/FetchPageWriteNewPageGuarded BUG调试 Task2 - Hash Table PageHeader PageDirectory PageB…

uniapp粘贴板地址识别

1&#xff1a; 插件安装 主要是依靠 address-parse 这个插件&#xff1a; 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2&#xff1a;html部分 <view class""><view class&quo…

OSPF进阶

一、LSA详解 Type&#xff1a;LSA的类型&#xff08;1、2、3、4、5、7类&#xff09; link-state-ID&#xff1a;链路状态表示符 ADV router&#xff1a;产生该LSA的路由器 age&#xff1a;老化时间 Metric&#xff1a;开销值&#xff0c;一般都为ADV router到达该路由的开…

深度学习------------------卷积神经网络(LeNet)

目录 LeNet网络手写的数字识别MNIST总结卷积神经网络&#xff08;LeNet&#xff09; 问题 LeNet网络 手写的数字识别 MNIST ①输入的是&#xff1a;3232的image ②放到一个55的卷积层里面&#xff08;为什么是5&#xff1f;因为32-x128&#xff0c;∴x5&#xff09;&#xff0c…

【rh】rh项目部署

【fastadmin】 1、项目先clone到本地&#xff0c;其中web为h5前端使用(gitclone后&#xff0c;把web内容放进去再提交)&#xff0c;其余为项目后端使用 2、安装本地环境&#xff0c;项目跑起来&#xff0c;步骤如下&#xff1a; 1&#xff09;查春.git 和 composer,json 版本信…

servlet基础操作(get)

1&#xff0c;首先创建一个javaweb的项目 简历一般的java项目选中项目&#xff0c;双击shift出现搜索栏 找到这个框架&#xff0c;选择里面的javaweb&#xff0c;注意选择右侧版本显示为4.0的javaweb 之后部署Tomcat 我这里是本地&#xff0c;所以在本地选的是local 第一步实…

Python 类的使用

目录 1、类的基本概念 1.1、类的定义 1.2、类的使用 2、类的公有属性和私有属性 2.1、为什么子类不能访问父类的私有属性/方法&#xff1f; 3、实例方法、类方法、静态方法 3.1、实例方法 3.2、类方法 3.3、静态方法 4、property 、XXX.setter和XXX.deleter的使用 4…

20240814确认RK3588S接USB摄像头录像+预览出现异常

20240814确认RK3588S接USB摄像头录像预览出现异常 2024/8/14 21:03 缘起&#xff0c;使用荣品RK3588S-AHD开发板接USB摄像头预览【几分钟】正常。 但是只要一开始录像预览就异常。 于是&#xff0c;上Rockchip的官方RK3588S开发板。预览52分钟还是出错了。 录像预览也异常。 但…

【IO day8】

第一题&#xff1a; 由于共享内存没有同步&#xff0c;想办法搞定共享内存的同步问题 p1.c p2.c 第二题&#xff1a; 使用第一题作用已经实现的共享内存&#xff0c;去做2个终端之间的互相聊天 t1.c t2.c

C语言 | Leetcode C语言题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; bool isSelfCrossing(int* distance, int distanceSize){if (distance NULL || distanceSize < 4) {return false;}for (int i 3; i < distanceSize; i) {if ((distance[i] > distance[i - 2]) && (distance[i - 1] &l…

临床数据科学和金融数据科学,选择R语言吧!

学习R语言不仅能够增强数据分析能力&#xff0c;还能开拓解决复杂问题的新方法。然而&#xff0c;在学习R语言的过程中&#xff0c;许多初学者会遇到各种陷阱&#xff0c;这些陷阱不仅会延缓学习进度&#xff0c;还可能导致学习动机的丧失。 下面内容摘录自《R 语言与数据科学的…

814的学习

共享内存实现

【谷粒商城学习笔记】项目介绍+分布式基础概念

文章目录 电商模式项目技术特色项目前置要求分布式基础概念微服务集群/分布式/节点远程调用负载均衡服务发现、注册中心配置中心服务熔断、降级网关 微服务架构图微服务划分图文章说明 电商模式 市面上有 5 种常见的电商模式 B2B、B2C、C2B、C2C、O2O。 B2B 模式&#xff1a;…

SAP与网易大数据系统集成案例

一、项目环境 江西某药业有限公司是一家以医药产业为主营、资本经营为平台的大型民营企业集团。公司成立迄今&#xff0c;企业经营一直呈现稳健、快速发展的态势集团总销售额超40亿元。 为了帮助企业更有效的进行分配和管理&#xff0c;包括人力、物资、时间和预算等资源&a…