优选算法-常见位运算总结

1.基础位运算:

>> :右移运算符:

  • 逻辑右移(无符号数):高位补 0,低位直接丢弃。
    示例:8 >> 2(二进制 1000 右移 2 位)结果为 0010(十进制 2)。

  • 算术右移(有符号数):高位补符号位(正数补 0,负数补 1),低位丢弃。

  • 示例:-8 >> 2(假设 8 位二进制 11111000 右移 2 位)结果为 11111110(十进制 -2)

  • 应用场景

  • 快速除以 2 的幂次。x>>n等价于:x/(2^n)

<<:左移运算符:

        将一个数的二进制表示向左移动指定的位数,右侧空出的位用 0 填充。

        x<<n,等价于 (x) 乘以 2 的 (n) 次方。

&:按位与:同1为1,有0为0.

|:按位或:有1为1,同0为0.

^:异或:相同为0,相异为1;无进位相加。

2.求一个数x的二进制位的第n 位是0还是1(最右侧为第0位):

(x>n)&1

3.将一个数x的二进制的第n位改成1(最右侧为第0位):

(1<<n) | x

4.将一个数x的二进制的第n位改成0(最右侧为第0位):

~(1<<n) | x

5.位图的思想:

使用int的二进制位32位:0~31,每一位有两种状态0,1.分别表示不同的含义。

6.获取一个数x的二进制位的最右侧的1: 1100 -> 0100

x&(-x)

-x:将x的最右侧的1的左侧的二进制都取反,1右侧保持不变;

x:1100  -x:0100

x&(-x)得到的就是1和1左边的二进制数,而1又是最右侧的,就得到了最右侧的1

7.删除一个数x的二进制位的最右侧的1:1100 -> 1000

x&(x-1)

x-1:将x的最右侧的1(包含该位)的右侧的二进制都取反,1左侧保持不变

x:1100   x-1: 1011

按位与后得就是删除最右侧1的效果。

8.位运算优先级

记不住就加括号

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

a^0 = a

a^a = 0(消消乐)

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

练习题:

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

class Solution {public int singleNumber(int[] nums) {int n = nums.length;int ret = 0;for(int i=0;i<n;i++){//a^a = 0//a^0 = aret^=nums[i];}return ret;}
}

260. 只出现一次的数字 III - 力扣(LeetCode)

class Solution {public int[] singleNumber(int[] nums) {int ret=0;// 将数组中所有元素进行异或运算,最终结果中保存的就是那两个不同的数x1,x2 的异或结果for(int i=0;i<nums.length;i++){ret^=nums[i];}// 先找出最低位为1的位置,之所以为1,是因为x1,和x2的这一位的二进制位是不相同的,异或后才会是1int tmp=ret&(-ret);//获取到最低位为1的值// 可以将数组分成两部分: tmp位为1,tmp位为0int x1=0;//tmp位为0int x2=0;//tmp位为1// 将所有元素与tmp进行&运算://结果不为0的一组进行^运算,结果为0的进行^运算//(相同元素^运算,会相互抵消a^a=0,得到的就是那个只出现一侧的元素),for(int i=0;i<nums.length;i++){if((tmp&nums[i] )==0 ) x1^=nums[i];else x2^=nums[i];}return new int[]{x1,x2};}
}

191. 位1的个数 - 力扣(LeetCode)

class Solution {public int hammingWeight(int n) {int ret = 0;while(n!=0){if((n & 1)==1) ret++;n>>=1;}return ret;}
}

338. 比特位计数 - 力扣(LeetCode)

class Solution {public int[] countBits(int n) {int[] ret = new int[n+1];for(int i=0;i<=n;i++){int t = 0;for(int j=0;j<32;j++){if(((i>>j)&1)==1) t++;}ret[i] = t;}return ret;}
}

461. 汉明距离 - 力扣(LeetCode)

class Solution {public int hammingDistance(int x, int y) {int ret=0;for(int i=0;i<32;i++){// 获取最低位的二进制位int m=(x>>i)&1;int n=(y>>i)&1;if(m!=n) ret++;}return ret;}
}

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

class Solution {public int getSum(int a, int b) {//^ :无进位相加// &: 保存进位值// int a=a^b;// int b=(a&b)<<1;while(b!=0){int a1=a^b;int b1=(a&b)<<1;//(a&b)记录当前为是否需要进位,<<1:得到进位值a=a1;b=b1;}//b=0时,说明不需要进位了,a中保留的就是结果return a;}
}

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

统计每个数的第i二进制位为1的个数,然后%3,当不为0时,说明该二进制位的1是要求的数的二进制位累计的,将结果的该为置1.以次计算32位.得到结果

class Solution {public int singleNumber(int[] nums) {// 位运算解决int log=0;for(int i=0;i<32;i++){int ret=0; //注意:ret每次计算都要复原for(int j=0;j<nums.length;j++){ret+=((nums[j]>>i)&1);//获取所有元素二进制第i位的和// if(((nums[j]>>i) & 1)==1) ret++; }ret%=3;if(ret==1)  log|=(1<<i);}return log;}
}

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

260题的改版

class Solution {public int[] missingTwo(int[] nums) {int ret=0;for(int i=0;i<nums.length;i++){ret^=nums[i];ret^=(i+1);}int n=nums.length;ret^=(n+1);ret^=(n+2);//找到二进制中最低位的1的位置,从而将数组分成两类int tmp = ret&(-ret);int x1=0;int x2=0;for(int i=0;i<nums.length;i++){if((tmp&nums[i])==0) x1^=nums[i];else x2^=nums[i];}for(int i=1;i<=n+2;i++){if((tmp&i)==0) x1^=i;else x2^=i;}return new int[]{x1,x2};}
}

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

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

相关文章

记一次MySQL数据库的操作练习

数据库基础使用数据库的操作&#xff1a;1.使用命令行连接数据库。在命令行键入”mysql -u root -p”命令。2.列出MySQL数据库管理系统的数据库列表。在命令行键入”show databases;”命令。3.创建数据库。在命令行键入”create database database_name;”命令。使用”show dat…

C++STL-list 底层实现

目录 一、实现框架 二、list_node节点类的模拟实现 节点构造函数 三、list_iterator迭代器的模拟实现 迭代器类的模板参数说明 构造函数 *运算符重载 运算符的重载 --运算符的重载 运算符的重载 !运算符的重载 list的模拟实现 默认成员函数 构造函数 拷贝构造函…

解决网站图片加载慢:从架构原理到实践

在当前的数字商业环境中&#xff0c;用户的在线体验至关重要。当一个潜在客户访问企业网站或电商平台时&#xff0c;如果页面加载过程迟缓&#xff0c;特别是图片和视频内容无法快速显示&#xff0c;用户的耐心会迅速耗尽。研究数据表明&#xff0c;网站加载时间与用户跳出率和…

windows注册表:开机自启动程序配置

目录 一、注册表位置 系统范围的开机自启动程序 当前用户的开机自启动程序 二、配置步骤 三、注意事项 四、其他方法 任务计划程序 启动文件夹 1. 创建程序快捷方式 2. 打开 Startup 文件夹 3. 将快捷方式移动到 Startup 文件夹 4. 验证程序是否自动启动 注意事项 …

(11)用于无GPS导航的制图师SLAM(一)

文章目录 前言 1 安装 RPLidar 和 Pixhawk 2 检查 RPLidar 的串行端口 3 安装更多软件包 4 创建Catkin工作空间 5 安装 RPLidar 节点 6 安装 Google Cartographer 前言 本页展示了如何使用 RPLidarA2 激光雷达(RPLidarA2 lidar)设置 ROS 和 Google Cartographer SLAM&a…

车载诊断架构 --- 基于整车功能的正向诊断需求开发

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

字帖生成器怎么用?电脑手机双端操作指南

字帖生成器是一款支持电脑端和手机端的免费练字工具&#xff0c;可一键生成PDF格式字帖并直接打印使用。本文基于官方公开版本&#xff0c;提供无广告、无营销的实测操作指南。 工具基础信息 软件名称&#xff1a;字帖生成器适用设备&#xff1a;Windows、安卓/鸿蒙核心功能&…

pycharm 远程连接服务器报错

配置远程链接的时候出现报错 Command finished with exit code 139 Execution was killed due to timeout Failed to execute command Rsync command ‘rsync’ was not found neither in local PATH nor as full executable path Starting introspection for Python… 放假前好…

局域网共享文件夹

准备工作&#xff1a; A电脑&#xff08;共享端&#xff09; B电脑&#xff08;本机&#xff09;在A电脑&#xff0c;选好要共享的目录&#xff0c;然后右键属性 > 高级共享 > 共享此文件夹 > 权限(全开)然后找到此电脑&#xff0c;右键&#xff0c;打开属性&#xff…

时序数据库全景指南:从场景选型到内核拆解

1. 什么是时序数据 时序数据&#xff08;Time-Series Data&#xff09; 是在时间上连续产生、且带有时间戳的观测值序列&#xff0c;典型特征&#xff1a;维度描述高并发写百万点/秒&#xff0c;追加为主写多读少90 % 查询是降采样或聚合时效性越新越热&#xff0c;旧数据价值递…

深入解析 Oracle 内存架构:驾驭 SGA 与 PGA 的性能艺术

引言&#xff1a;数据库的心脏与大脑如果说磁盘上的数据文件是 Oracle 数据库的“身体”&#xff0c;是永久存储的基石&#xff0c;那么内存结构就是其“心脏与大脑”。它负责所有计算活动的发生&#xff0c;决定了数据泵送的速度与效率。一个配置得当、运行顺畅的内存体系&…

竣工验收备案识别技术:通过AI和OCR实现智能化文档处理,提升效率与准确性,推动建筑行业数字化转型。

竣工验收备案是建设工程项目投入使用的最终法定程序&#xff0c;是确保工程符合规划、质量、消防、环保等各项要求的核心关口。传统的备案流程依赖大量纸质文档和人工审核&#xff0c;效率低下且易出错。随着人工智能与大数据技术的崛起&#xff0c;竣工验收备案识别技术应运而…

76 最小覆盖子串

76 最小覆盖子串 文章目录76 最小覆盖子串1 题目2 解答1 题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;…

趣味学Rust基础篇(变量与可变性)

这篇文章将用通俗的比喻和清晰的逻辑&#xff0c;带你深入理解 Rust 变量背后的核心思想&#xff0c;让你不仅“会用”&#xff0c;更能“明白为什么”。 Rust 的“盒子哲学”&#xff1a;变量、可变性、常量与隐藏 想象一下&#xff0c;Rust 里的变量就像一个个盒子。你把值&a…

2025年- H100-Lc208--912.排序数组(快速选择排序)--Java版

1.题目2.思路 快速选择排序的平均时间复杂度是O&#xff08;nlogn&#xff09;&#xff0c;最坏时间复杂度是O&#xff08;n^2&#xff09;&#xff0c;最好的时间复杂度是O&#xff08;nlogn&#xff09;&#xff0c;空间复杂度是O&#xff08;nlogn&#xff09;。 排序算法中…

解决 pdf.mjs 因 MIME 类型错误导致的模块加载失败问题

Mozilla PDF.js V4 开始&#xff0c;它官方分发确实只提供了 ESM 模块&#xff08;.mjs&#xff09;&#xff0c;没有以前的 pdf.js、pdf.worker.js UMD 版本了。 这个问题本质上是 浏览器要求以 application/javascript MIME 类型加载 ES Module&#xff0c;而你引入的 pdf.mj…

STM32八大模式

前言&#xff1a;STM32存在八大模式&#xff0c;分别如下推挽输出&#xff0c;开漏输出&#xff0c;复用推挽输出&#xff0c;复用开漏输出浮空输入&#xff0c;上拉输入&#xff0c;下拉输入&#xff0c;模拟输入STM32标准IO结构图如下&#xff1a;其中如下电路为保护电路&…

OpenCV4.X库功能全解---个人笔记

文章目录前言1.Core核心功能1.1 基本数据类型和结构&#xff1a;1.2 数组操作&#xff1a;1.3 数学函数&#xff1a;1.4 随机数生成&#xff1a;1.5 线性代数运算&#xff1a;1.6 常用数据结构和算法&#xff1a;1.7 XML/YAML文件读写&#xff1a;1.8 错误处理&#xff1a;1.9时…

代码随想录刷题Day44

二叉搜索树的最近公共祖先 这道题&#xff0c;可以沿用二叉树的最近公共祖先的求法进行求解&#xff0c;也就是root判断-左右子树递归求LCA-根据左右子树的LCA结果返回值这一套。 但是&#xff0c;如果要用上搜索二叉树的有序性这个信息的话&#xff0c;就可以直接在递归时候确…

springmvc的数据校验和处理的一个例子

JSR-303是Java 的标准规范&#xff0c;而 Spring MVC 对其提供了完美的支持和集成 1.JSR-303 的身份 JSR-303 是 Java 标准 JSR&#xff1a;Java Specification Request&#xff08;Java 规范请求&#xff09; JSR-303&#xff1a;Bean Validation 1.0&#xff08;Bean 验证规范…