位运算---总结

位运算

基础

1. & 运算符 : 有 0 就是 0
2. | 运算符 : 有 1 就是 1
3. ^ 运算符 : 相同为0 相异为1 and 无进位相加
  1. 位运算的优选级

    不用在意优先级,能加括号就加括号
    
  2. 给一个数 n ,确定它的二进制位中第 x 位是 0 还是 1?

规定: 题中所说的第x位指:int 在32位机器下4个字节32位,从右向左依次增加,从0位开始,即 第 0 位 到第 31 位.
(n >> x) & 1 
  1. 将一个数 n 的二进制位表示的第 x 位修改为 1
n |= (1 << x)
  1. 将一个数 n 的二进制表示的 第 x 位修改为 0
n &= ~(1 << x) 
  1. 提取一个数 n 二进制表示中最右侧的1
n & -n;
-n : 将最右侧的1左边的区域全部变为相反数,右边的1的数不变(本来就是0)0 1 1 0 1 0 1 0 0 0 
~   1 0 0 1 0 1 0 1 1 1
+1  1 0 0 1 0 1 1 0 0 0
n:  0 1 1 0 1 0 1 0 0 0 
------------------------0 0 0 0 0 0 1 0 0 0
  1. 干掉一个数( n )二进制表示中最右侧的1
n &= (n -1)
  1. 异或(^)运算的运算律
1. a ^ 0 = a;
2. a ^ a = 0; 消消乐
3. a ^ b ^ c = a ^ (b ^ c) 符合交换律和结合律异或
无进位相加解释:
1 0 1 1 0 1 0
0 0 1 0 1 0 1
1 0 1 0 0 0 0
-------------
0 0 1 1 1 1 1   --> 两个 1 会消消乐(本质就是1的抵消), 即无进位相加 

题目练习

191.位1的个数

思路一:依次判断每个位是否为1,为 1 ans++;
class Solution {
public:int hammingWeight(int n) {int ans = 0;int sum = 32;for(int i = 0; i < 32; i++){if((n >> i) & 1){ans++;}}return ans;}
};思路二:依次消除最低位的 1, 消除一次 ans++;
class Solution {
public:int hammingWeight(int n) {int ans = 0;while(n){n &= (n -1);ans++;}return ans;}
};

338. 比特位计数

思路:依次消除最低位的 1, 消除一次 count++; 对每个数字统计一次即可
class Solution {
public:vector<int> countBits(int n) {vector<int> ans;for(int i = 0; i <= n; i++){int count = 0;int temp = i;while(temp){temp &= (temp - 1);count++;}ans.push_back(count);}return ans;}
};

461. 汉明距离

//思路:先异或(相同为0相异为1)后统计1的个数
class Solution {
public:int hammingDistance(int x, int y) {x ^= y;int ans = 0;while(x){x &= (x -1);++ans;}return ans;}
};

136. 只出现一次的数字

//思路:利用异或运算规律:
// 1. a ^ a = 0; 
// 2. a ^ 0 = a 
// 3. 交换律和结合律
class Solution {
public:int singleNumber(vector<int>& nums) {     int ans = 0;for(int iter : nums){ans ^= iter;}return ans;}
};

260. 只出现一次的数字 III

//思路:利用异或的规律,将所有数据异或一次,结果一定是只出现一次的两个元素异或后的结果,然后利用异或的相同为 0 相异为 1,并用最低位 1 来区分两个只出现一次的元素,划分为两个集合(此时每个集合中只有一个数出现一次,其他数都出现了两次),分别异或即可得到结果
class Solution {
public:vector<int> singleNumber(vector<int>& nums) {unsigned int xor_all = 0; //为什么使用unsigned int ?//使用int可能会导致溢出//unsigned int 自动会进行模运算,保证结果始终在unsigned int 表示范围内//int: (-2^31 到 2^31 - 1)//unsigned int: (0 ~ 2^32 -1)for(int iter : nums){xor_all ^= iter;}//获取异或结果的最低位为 1 的位 int lowbit = xor_all & (-xor_all);vector<int> ans(2);for(int x : nums){if((x & lowbit) == 0){ans[1] ^= x;}else{ans[0] ^= x;}}return ans;}
};

面试题 01.01. 判定字符是否唯一

思路:使用hash表统计每个字符出现的次数,然后遍历hash表即可
class Solution {
public:bool isUnique(string astr) {unordered_map<char,int> hash;for(int i = 0; i < astr.size(); i++){hash[astr[i]]++;}for(auto iter : hash){if(iter.second > 1){return false;}}return true;}
};class Solution {
public:bool isUnique(string astr) {//利用位图思想来解决问题if(astr.size() > 26){return false;}int bitmap = 0;for(char c : astr){int n = c - 'a';//判断字符是否已经出现过if(bitmap & (1 << n)){return false;} else{bitmap |= (1 << n);}}return true;}
};

268. 丢失的数字

//利用异或的规则:将0~n的数字和 nums中的数字都异或一次结果即为没有出现的那个数,其他数都出现了两次
class Solution {
public:int missingNumber(vector<int>& nums) {unsigned int xor_all = 0;int n = nums.size();for(int i = 0; i <= n; i++){xor_all ^= i;}for(int x : nums){xor_all ^= x;}return xor_all;}
};

371. 两整数之和

//思路:先使用无进位相加,计算进位,无进位相加直到进位为0
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;}return a;}
};

137. 只出现一次的数字 II

//思路:统计每个数字第i位的和sum, sum %= 3 即可判断只出现一次的数字第i位
//3n 0 + 0 = 0  %=3 == 0
//3n 0 + 1 = 1  %=3 == 1
//3n 1 + 1 = 3n + 1 %3 == 1
//3n 1 + 0 = 3n  %=3 == 1  -->此方法可推广到n,即除某个元素只出现一次外,其他元素都出现了n次,%=n 即可判断只出现一次的数字的第i位
class Solution {
public:int singleNumber(vector<int>& nums) {int ans = 0;for(int i = 0; i < 32; i++){int sum = 0;for(int x : nums){if(x & (1 << i)){++sum;}}sum %= 3; if(sum == 1){ans |= (1 << i);}}return ans;}
};

面试题 17.19. 消失的两个数字

//思路:将所有数字全部异或,转换为题目只出现了一次的数字3
class Solution {
public:vector<int> missingTwo(vector<int>& nums) {unsigned int xor_all = 0;int n = nums.size();for(int x : nums){xor_all ^= x;}for(int i = 1; i <= n+2; i++){xor_all ^= i;}//计算最低位为1的位int lowbit = xor_all & (-xor_all);vector<int> ans(2);for(int x : nums){if((lowbit & x) == 0){ans[0] ^= x;}else{ans[1] ^= x;}}for(int i = 1; i <= n+2; i++){if((lowbit & i) == 0){ans[0] ^= i;}else{ans[1] ^= i;}}return ans;}
};

结束!

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

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

相关文章

Java SpringBoot的自定义配置

一&#xff0c;一个类多个属性的情况 application.properties配置文件写法 my.config.ip127.0.0.1 my.config.port8080自定义配置类&#xff1a;MyTestConfig import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties…

Matlab FCM模糊聚类

1、内容简介 Matlab 211-FCM模糊聚类 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

C++项目 —— 基于多设计模式下的同步异步日志系统(4)(双缓冲区异步任务处理器(AsyncLooper)设计)

C项目 —— 基于多设计模式下的同步&异步日志系统&#xff08;4&#xff09;&#xff08;双缓冲区异步任务处理器&#xff08;AsyncLooper&#xff09;设计&#xff09; 异步线程什么是异步线程&#xff1f;C 异步线程简单例子代码解释程序输出关键点总结扩展&#xff1a;使…

C# 使用 BinaryFormatter 和相关类型时的反序列化风险

C# 使用 BinaryFormatter 和相关类型时的反序列化风险 由来&#xff1a;在项目使用.NET Reactor 混淆 C# 的序列化和反序列化发现存在的问题&#xff0c;读取文件时&#xff0c;转化为对应的类数据有时候为空&#xff0c;所以就在网上搜索了相关知识&#xff0c;在此做个笔记以…

OpenCv高阶(四)——角点检测

一、角点检测 在计算机视觉中&#xff0c;角点检测是识别图像中局部区域&#xff08;角点&#xff09;的关键技术&#xff0c;这些区域通常是两条或多条边缘的交点&#xff0c;具有丰富的结构信息&#xff0c;常用于图像匹配、跟踪、三维重建等任务。 Harris角点检测算法是一…

Conda 入门指令教程

Conda 入门指令教程 Conda 是一个强大的包和环境管理工具&#xff0c;广泛应用于数据科学和机器学习项目中。本文将介绍 Conda 的常用指令&#xff0c;帮助你快速上手。 1. Conda 基础操作 查看 Conda 版本 conda --version显示当前安装的 Conda 版本。 更新 Conda conda…

Unity ShaderLab引用HLSL文件找不到其中函数

在写Unity Shader的过程中&#xff0c;常常需要将方法封装到HLSL文件中&#xff0c;今天遇到一个这样的报错&#xff0c; 明明hlsl文件路径引用没问题&#xff0c;却引用不到方法 并且将分散文件中的函数复制过来一切正常&#xff0c;最终定位到HLSL的预编译指令中 这指令的…

uniapp上传图片时(可选微信头像、相册、拍照)

参考文献&#xff1a;微信小程序登录——头像_onchooseavatar-CSDN博客 <button open-type"chooseAvatar" chooseavatar"onChooseAvatar"> </button>onChooseAvatar(e) {uni.showLoading({title: 上传中...,mask: true});uni.uploadFile({url…

单元测试的一般步骤

Qt Test Qt Test 是 Qt 开发人员发布的一个单元测试框架&#xff0c;用于测试基于 Qt 框架的应用程序或库。它提供了单元测试框架中常见的所有功能以及用于测试图形用户界面的扩展。 1.自动化测试包络ui测试>接口测试>单元测试&#xff1b;现问如何使用Qt进行单元测试&…

【Matlab】中国沿岸潮滩宽度和坡度分布

【Matlab】中国沿岸潮滩宽度和坡度分布 参考文献见最后或者阅读原文&#xff01; 中国沿岸潮滩宽度和坡度分布: figure 1 a 潮滩宽度分布。b 潮滩坡度分布。 图中标注了中国沿海各省&#xff0c;分别为辽宁&#xff08;LN&#xff09;、河北&#xff08;HB&#xff09;、山东&…

理解.NET Core中的配置Configuration

什么是配置 .NET中的配置&#xff0c;本质上就是key-value键值对&#xff0c;并且key和value都是字符串类型。 在.NET中提供了多种配置提供程序来对不同的配置进行读取、写入、重载等操作&#xff0c;这里我们以为.NET 的源码项目为例&#xff0c;来看下.NET中的配置主要是有…

windows服务器及网络:论如何安装(虚拟机)

今天我要介绍的是&#xff1a;在Windows中对于安装系统&#xff08;虚拟机的步骤以及相关的安装事宜&#xff09;&#xff0c;事不宜迟&#xff0c;让我们来看看系统安装&#xff08;虚拟机&#xff09;是怎么操作的&#xff1a; 对现在来说&#xff0c;安装电脑系统已经是非常…

shardingsphere-jdbc集成Seata分布式事务

1、导入相关依赖 <!-- shardingsphere-jdbc --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId><version>5.5.1</version></dependency><!-- shardingspher…

05-DevOps-Jenkins自动拉取构建代码

新建Gitlab仓库 先在Gitab上创建一个代码仓库&#xff0c;选择创建空白项目 安装说明进行填写&#xff0c;然后点击创建项目 创建好的仓库是空的&#xff0c;什么都没有 新建一个springboot项目&#xff0c;用于代码上传使用。 只是为了测试代码上传功能&#xff0c;所以代码…

C#核心(24)结构体和类的区别,抽象类和接口的区别(面试常问)

前言 随着上一节我们对StringBulider的讲解落下帷幕&#xff0c;c#核心的知识点我们也即将告一段落,我们讲完了面向对象要用的三大特性&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;和七大原则。期中自然也不乏一些小的散的碎的的知识点。 今天我们要讲的也…

HTMLCSS实现异环网站,期末web作业

本网站是我在学习前端时敲得&#xff0c;仅供学习使用。 这段代码是一个完整的 HTML 网页项目&#xff0c;包含 HTML、CSS 和 JavaScript 部分&#xff0c;用于构建一个名为 “异环” 的网页。网页具备头部导航栏、主体视频展示、图片交互元素、音乐播放控制、视频弹窗播放以及…

Oracle表的别名不能用as,列的别名可以用as

在 Oracle 数据库中&#xff0c;‌表的别名‌和‌列的别名‌在使用 AS 关键字时确实有不同规则&#xff0c;以下是详细说明&#xff1a; 1. 表的别名&#xff08;Table Alias&#xff09;‌ ‌不支持 AS 关键字‌&#xff0c;直接跟在表名后即可。‌语法示例‌&#xff1a; S…

【SAP ME 44】在 HANA DB中报废SFC时的SHOP_ORDER表记录锁定

症状 SELECT…FROM SHOP_ORDER FOR UPDATE 在 SFC 报废期间持有锁,当同时调用数量较大时,可能会导致 HANA 数据库出现大量锁积压。这有时会导致因等待 HANA 数据库释放“选择更新”锁而导致报废 SFC 花费数分钟。 HANA 数据库日志中的示例: # begin PreparedStatement_ex…

Vscode开发Vue项目NodeJs启动报错处理

文章目录 背景一、npm启动报错报错信息定位原因处理方案第一步、下载安装高版本 二、node 无法识别报错信息处理方案定位原因第一步、检测环境变量第二步、重新开启界面 背景 使用Vscode开发Vue项目&#xff0c;使用到NodeJs&#xff0c;记录出现的问题及处理方案&#xff0c;…

破局遗留系统!AI自动化重构:从静态方法到Spring Bean注入实战

在当今快速发展的软件行业中,许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法,随着业务的不断发展,其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具,为 Java 遗留系统的重构提供了全新的解决方案,能够实现从静态方法到 Spring B…