当前位置: 首页 > backend >正文

算法:位运算

1.常见位运算总结

1.基础位运算

&: 有0就是0。

|:有一就是一

^:相同为0,相异为1。

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

(n >> x) & 1

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

n = n | (1 << x)

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

n = n & (~(1 << x))

5.位图的思想

哈希表中里面开32个空间

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

n & (-n) 。将最右侧的1,左边的区域全部变成相反的。

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

n & (n - 1)。

8.位运算的优先级和多,所以建议能加括号就加括号

9.异或运算的运算律

a ^ 0 = a.    a ^ a = 0.    a^b^c = a^(b^c)。

2.判断字符是否唯一

面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)

思路一:哈希表

思路二:位图+鸽巢原理。

class Solution {
public:bool isUnique(string astr) {if(astr.size() > 26)return false;int bitmap = 0;//位图for(auto e : astr){int i = e - 'a';if(((bitmap >> i) & 1 ) == 1)//插入前如果第i位等于1,那么就存在了不唯一的字符return false;bitmap |= (1 << i);//插入位图,将第i位置为1}return true;}
};

3.丢失的数字

268. 丢失的数字 - 力扣(LeetCode)

解法一:哈希表。

解法二:高斯求和。

解法三:位运算:异或。

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

4.两正数之和

371. 两整数之和 - 力扣(LeetCode)

思路:位运算 : 异或(算出无进位相加)+ & 算出进位的值。

class Solution 
{
public:int getSum(int a, int b) {while(b != 0){int x = a ^ b;//算出无进位相加int crray = (a & b) << 1;a = x;b = crray;}return a;}
};

5.只出现一次的数字2

137. 只出现一次的数字 II - 力扣(LeetCode)

思路:位运算,因为有三次相同的数字,将每一次出现的数字的当前位加起来%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;ret |= sum << i;}return ret;}
};

6.消失的两个数字

面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

这道题相当于 丢失的数字 + 只出现一次的数字3

思路:位运算

1.将所以数异或在一起,(1 ~ N和数组nums)

2.找到tmp中比特位上位1的哪一位

3.根据x位的不同,划分成两类再异或。

class Solution 
{
public:vector<int> missingTwo(vector<int>& nums) {int n = nums.size();int sum = 0;for(auto e : nums){sum ^= e;}for(int i = 1; i <= n + 2; i++){sum ^= i;}int x = 0;for(int i = 0; i < 32; i++){if(((sum >> i) & 1) == 1)x = i;}int type1 = 0,type2 = 0;for(auto e : nums){if(((e >> x) & 1) == 1)type1 ^= e;elsetype2 ^= e;}for(int i = 1; i <= n + 2; i++){if(((i >> x) & 1) == 1)type1 ^= i;elsetype2 ^= i;}return {type1,type2};}
};

http://www.xdnf.cn/news/12866.html

相关文章:

  • AUTOSAR实战教程--DoIP_02_诊断链路建立流程
  • 零基础入门:5分钟学会OpenHands远程编程环境搭建
  • 在Pnetlab6上绕过TPM、安全启动和 RAM 检查安装windows 11笔记
  • 构建AI中台:从技术孤岛到智能服务能力平台化
  • 自然语言处理——语言模型
  • 基于定制开发开源AI智能名片S2B2C商城小程序的首屏组件优化策略研究
  • gorm 配置数据库
  • LLMs 系列科普文(11)
  • 25.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--用户服务接口
  • vscode 配置 latex
  • Python-Flask
  • MCP Resource模块详解
  • 386. 字典序排数
  • 达梦数据库字段类型 varchar 转 text
  • Python初体验学习笔记
  • 电路图识图基础知识-电动机正反转控制电路详解(二十)
  • 省略号和可变参数模板
  • OPENCV图形计算面积、弧长API讲解(2)
  • 做题笔记(ctfshow)
  • LeetCode - 145. 二叉树的后序遍历
  • JavaScript 内置对象全解析
  • QRadioButton(续)+ CheckBox + QLabel(2)
  • 【Go语言基础【20】】Go的包与工程
  • c#,Powershell,mmsys.cpl,使用Win32 API展示音频设备属性对话框
  • JavaWeb预习(jdbc)
  • 拼多多官方内部版 7.58.0 | 极限精简,只有2.5M
  • 【笔记】Poetry虚拟环境创建示例
  • Prompt Tuning(提示调优)到底训练优化的什么部位
  • DiscuzX3.5发帖json api
  • maven 1.0.0idea的使用说明