【基础算法】位运算

0.常见位运算总结

1.基础位运算

<<     >>     ~

&:有0就是0

|:有1就是1

^:相同为0,相异为1/无进位相加

2.给一个数n,确定它的二进制表示中的第x位是0还是1

n & (1 << x) 结果为0就是0,结果不为0就是1。

3.将一个数n的二进制表示的第x位修改成1

n |= (1<<x)

4.将一个数n的二进制表示的第x位修改成0

n &= ~(1<<x)

5.位图的思想

位图本质就是一种哈希的思想,只是哈希是利用数组存放,位图是用一个变量来存放,即这个变量的比特位可以是0可以是1,2-4本质都是位图的。

6.提取一个数(n)二进制表示中最右侧的1

n & -n

-n:先对n取反再加1,会发现把最右侧的1,左边的区域全部变成相反。

7.干掉一个数(n)二进制表示中最右侧的1

n & (n - 1)

n - 1:将最右侧的1,右边的区域全部变为相反(包含1)。

8.位运算的优先级

能加括号就加括号就无需考虑优先级了。

9.异或(^)运算的运算律

a^0=a

a^a=0

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

1.位1的个数

位1的个数

思路:

 利用n & (1 << i)结果是否为0来确定该位置是否为0或者1.

class Solution {
public:int hammingWeight(int n) {int cnt = 0;for(int i = 0; i < 32; i++)if((n & (1 << i))) cnt++;return cnt;}
};

2.比特位计数

比特位计数

思路:

 n &= (n - 1):干掉最右侧的1

class Solution {
public:int countOnes(int x){int cnt = 0;while(x > 0){//干掉最右侧的1x &= (x - 1);cnt++;}return cnt;}vector<int> countBits(int n) {vector<int> ans(n + 1);for(int i = 0; i <= n; i++){ans[i] = countOnes(i);}return ans;}
};

3.汉明距离

汉明距离

思路:

 利用异或的相同为0,相异为1的规则,来计算两个数不同比特位的个数。

class Solution {
public:int hammingDistance(int x, int y) {int cnt = 0, s = x ^ y;while(s){cnt += s & 1;s >>= 1;}return cnt;}
};

4.只出现一次的数字

只出现一次的数字

思路:

 利用异或规律a^a = 0, a^0 = a;

出现偶数次的数最终都会被消除留下的1个数就是只出现一次的数字。

class Solution {
public:int singleNumber(vector<int>& nums) {int val = 0;for(auto e : nums)val ^= e;return val;}
};

5.只出现一次的数字III

只出现一次的数字iii

思路:

 有两个只出现一次的数字

则可分组求出,以数组异或和的最右侧1为分界分组

把这个最右侧的1提取出来用的是n & -n

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {int sum = 0;int res1 = 0;int res2 = 0;for(int i = 0; i < nums.size(); i++){sum ^= nums[i];}// 提取sum最右侧的1,同时为了防溢出int index = (sum == INT_MIN ? sum : (sum & -sum)); for(int e : nums){if(e & index) res1 ^= e;else res2 ^= e;}return {res1, res2};}
};

6.判定字符是否唯一

判定字符是否唯一

思路:

解法一:哈希表

解法二:位图

 运用位图的思想看这个字符加入位图之前是否有这个字符,有的话说明这个字符不唯一,那就返回false

class Solution {
public:bool isUnique(string astr) {//位图0-25 -> a-zint bitMap = 0;//鸽巢原理-》小优化if(astr.size() > 26) return false;for(char ch : astr){int i = ch - 'a';// 判断字符是否在位图中if(((bitMap >> i) & 1) == 1) return false;// 将字符进入位图bitMap |= (1 << i);}return true;}
};

 7.丢失的数字

丢失的数字

 思路:

解法一:哈希表

解法二:高斯求和

解法三:位运算

利用异或运算规律求解。

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

 8.两整数之和

两整数之和

 思路:

运用的是异或的无进位相加的性质,注意c++代码需要防溢出

a&b算进位,当进位为0时a就是最终结果。

class Solution {
public:int getSum(int a, int b) {//进位为0时结束while(b != 0){int x = a ^ b; //a与b无进位相加unsigned int carry = (unsigned int)(a & b) << 1;//算出进位,防止溢出a = x;b = carry;}return a;}
};

9.只出现一次的数字ii

只出现一次的数字ii

思路:

 利用位图的思想,每个比特位的和的规律得出。

class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for(int i = 0; i < 32; i++){int sum = 0;//计算数组中当前位置的比特位之和for(auto x : nums)if(((x >> i) & 1) == 1) sum++;//比特位之和是3的倍数当前位置修改为0,否则修改为1sum %= 3;if(sum == 1) ret |= (1 << i);}return ret;}
};

10. 消失的两个数字

消失的两个数字

思路:

 与丢失的数字和只出现一次的数字iii结合,就是这个题的思路

class Solution {
public:vector<int> missingTwo(vector<int>& nums) {int sum = 0;//通过两次循环异或得到的sum就是缺失的两个数的异或结果sum = a^bfor(auto x : nums) sum ^= x;for(int i = 1; i <= nums.size() + 2; i++) sum ^= i;//找出右侧第一个比特位为1,即a和b在这个位置的比特位不同的那个位置int diff = 0;while(1){if(((sum >> diff) & 1) == 1) break;diff++;}//根据diff的不同,将数组划分为两类来异或int a = 0, b = 0;for(auto x : nums){if(((x >> diff) & 1) == 1) a ^= x;else b ^= x;}for(int i = 1; i <= nums.size() + 2; i++){if(((i >> diff) & 1) == 1) a ^= i;else b ^= i;}return {a, b};}
};

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

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

相关文章

一站式AI创作平台:融合GPT会话、GPTs应用、Midjourney视觉艺术与Suno AI音乐合成模块

一、系统简介 星河易创AI系统基于ChatGPT的核心技术打造&#xff0c;集成了自然语言问答和艺术创作功能。该系统兼容Midjourney绘画技术&#xff0c;并支持官方GPT模型。它提供了多样化的应用&#xff0c;包括GPTs的多场景应用、实时GPT语音对话能力、GPT-4模型的先进特性&…

RTSP,RTP,RTCP

机器学习 Machine Learning&#xff08;ML&#xff09; 深度学习&#xff08;DL&#xff0c;Deep Learning&#xff09; CV计算机视觉&#xff08;computer vision&#xff09; FFMPEG&#xff0c;MPEG2-TS,H.264,H.265,AAC rstp,rtp,rtmp,webrtc onvif,gb28181 最详细的音…

力扣-有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 注…

【城市】应届生第一次打工需要知道的常识(薪资结构,社保,五险二金,个税,专项扣除)

【城市】应届生第一次打工需要知道的常识&#xff08;薪资结构&#xff0c;社保&#xff0c;五险二金&#xff0c;个税&#xff0c;专项扣除&#xff09; 文章目录 1、什么是应届生 & 如何界定应届生2、社保&#xff0c;五险一金&#xff0c;五险二金3、薪资结构&#xff0…

idea设置自定义注释模板

idea设置自定义注释模板 欢迎使用Markdown编辑器 在IntelliJ IDEA中设置自定义注释模板&#xff0c;你可以按照以下步骤操作&#xff1a; 欢迎使用Markdown编辑器 打开 IntelliJ IDEA&#xff0c;进入 File 菜单&#xff1a; 在 Windows 或 Linux 系统中&#xff0c;点击顶部…

ubuntu sudo apt-get install neo4j 配置安装与设置远程访问

文章目录 下载Adding the Debian repositoryInstalling Neo4j安装流程设置远程访问 下载 neo4j 官方的下载地址&#xff0c;进入页面之后&#xff0c;往下滑&#xff1a; https://neo4j.com/deployment-center/#community 点击 Visit https://debian.neo4j.com/ Adding the …

Xilinx IP解析之Multiplier v12.0

前言 乘法器是Xilinx的数学运算IP核中最基础的IP核之一&#xff0c;熟练掌握它是使用FPGA进行数字信号处理的基础。 本文参考pg108-mult-gen.pdf——Multiplier v12.0。 一. IP 概述 与 产品手册 参考&#xff1a;[Multiplier (xilinx.com))](https://china.xilinx.com/produc…

Python可视化利用Seaborn实现高级统计图表

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用 Seaborn 实现高级统计图表 在数据科学和数据可视化领域&#xff0c;Seaborn 是一个备…

Go语言基本语法(三)指针

什么是指针 在Go语言中&#xff0c;"指针是一种存储变量内存地址的数据类型"&#xff0c;意味着指针本身是一个特殊的变量&#xff0c;它的值不是数据本身&#xff0c;而是另一个变量在计算机内存中的位置&#xff08;地址&#xff09;。形象地说&#xff0c;就像存…

解决iview(view ui)中tabs组件中使用图片预览组件ImagePreview,图片不显示问题

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、问题描述二、原因分析三、解决方案总结 前言 最近在写个人项目的web端和浏览器插件&#xff0c;其中一个功能是base64和图片的转换。因为分成四个小功能&#xff0c;所以使用的iview的tabs来展示不同功能&#xff0c…

Liunx磁盘管理(上)

Liunx磁盘管理&#xff08;中&#xff09;-CSDN博客 目录 一.硬盘类型 机械硬盘&#xff08;HDD&#xff09; 固态硬盘&#xff08;SSD&#xff09; 二.插拔方式 1. 热插拔&#xff08;Hot Swapping&#xff09; 2. 冷插拔&#xff08;Cold Swapping&#xff09; 3. 模块…

回溯Backtracking Algorithm

目录 1) 入门例子 2) 全排列-Leetcode 46 3) 全排列II-Leetcode 47 4) 组合-Leetcode 77 5) 组合总和-Leetcode 39 6) 组合总和 II-Leetcode 40 7) 组合总和 III-Leetcode 216 8) N 皇后 Leetcode 51 9) 解数独-Leetcode37 10) 黄金矿工-Leetcode1219 其它题目 1) 入…