【总结】浅刷leetcode,对于位运算提高性能的一些总结
目录
什么是位运算?
位运算技巧
1. 判断奇偶性
2. 交换两个数
3. 判断一个数是否是2的幂次方
4. 取绝对值
5. 计算平均数
结论
位运算技巧是计算机科学中非常重要的一部分,它可以用来解决很多实际问题。在本篇博客中,我们将介绍一些常见的位运算技巧,以及它们在实际应用中的使用。
什么是位运算?
位运算是一种对二进制数进行操作的运算。它包括按位与、按位或、按位异或、按位取反等操作。在计算机中,位运算是非常快速的,因为它们可以直接在硬件层面上执行。
位运算技巧
1. 判断奇偶性
我们可以使用位运算来判断一个数的奇偶性。如果一个数的二进制表示的最后一位是0,那么它就是偶数,否则它就是奇数。因此,我们可以使用按位与运算符(&)来判断一个数的奇偶性。
public static bool IsEven(int n)
{
return n % 2 == 1;
}
public static bool IsEven(int n)
{
return (n & 1) == 0;
}
相比于n%2通过取模运算来判断一个数字是否是奇偶数,&运算性能快非常多。取模运算的实现原理是,将被除数按位分解得到的每一位与除数相比较,如果大于除数,则将除数不断左移一位(乘2),直到它大于被除数为止,然后将被除数减去这个数,再进行下一次比较。如果小于除数,则将对应的商位为0,然后考虑下一位。
2. 交换两个数
我们可以使用位运算来交换两个数的值。假设我们有两个变量a和b,我们可以使用异或运算符(^)来交换它们的值。
交换两个数有很多种实现方法
比如通过临时变量,通过加减法
static bool Swap(ref int a,ref int b)
{
//通过临时变量
int temp = a;
a = b;
b = temp;
//通过加法或者减法省去临时变量
a += b;
b -= a;
a -= b;
}
利用异或的性质交换两个数,是性能最好的一种手段。
static bool Swap(ref int a, ref int b)
{
//通过异或交换两个数的值
a ^= b;
b ^= a;
a ^= b;
}
异或基本性质如下:
1. 可逆性:A xor B等于C,那么C xor B等于A,C xor A等于B。也就是说,对于任意两个值进行异或运算所得的结果,只要其中有一个值和结果以及另外一个值已知,就可以得到另外一个值。
2. 结合律和交换律:异或运算可以任意交换和结合,例如(A xor B) xor C = A xor (B xor C),A xor B = B xor A。
3. 自反性:一个数和自己异或的结果为0,即A xor A = 0。
4. 零值:任何数和0进行异或的结果都等于这个数本身,即A xor 0 = A。
异或运算在计算机中有广泛应用,例如数据加密、压缩、校验等领域。其中,数据校验往往采用奇偶校验或者循环冗余校验(CRC)算法,而这些算法都需要用到异或运算。此外,在编程语言中,异或运算也经常用于实现位操作和状态判断等功能。
3. 判断一个数是否是2的幂次方
如果一个数是2的幂次方,那么它的二进制表示中只有一位是1,其余位都是0。因此,我们可以使用按位与运算符(&)来判断一个数是否是2的幂次方。n & (n - 1)的运算结果可以将n的二进制表示中的最后一个1变成0,其他位保持不变,也就是把n的最低位的1变成0。另外,n & (n - 1)的运算还可以用于统计一个二进制数中1bits的个数。如果一个数的二进制表示中有k个1bit,那么对这个数连续做k次n & (n - 1)操作,就可以将二进制表示中的所有1bit都消除。
static bool IsPowerOfTwo(int n)
{
return (n & (n - 1)) == 0;
}
4. 取绝对值
我们可以使用位运算来取一个数的绝对值。假设我们有一个变量n,我们可以使用按位与运算符(&)和减法运算符(-)来取它的绝对值。
public static int Abs(int n)
{
int mask = n >> 31; return (n + mask) ^ mask;
}
5. 计算平均数
我们可以使用位运算来计算两个数的平均数。假设我们有两个变量a和b,我们可以使用位运算符(>>)来计算它们的平均数。
public static int Average(int a, int b)
{
return (a & b) + ((a ^ b) >> 1);
}
结论
位运算技巧在计算机科学中是非常重要的。它们可以用来解决很多实际问题,例如判断奇偶性、交换两个数、判断一个数是否是2的幂次方、取绝对值和计算平均数等。在实际应用中,我们应该根据具体情况选择合适的位运算技巧来解决问题。
————————————————
版权声明:本文为CSDN博主「徐欲东」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/XuYuDong_/article/details/130262839
【总结】浅刷leetcode,对于位运算提高性能的一些总结的更多相关文章
- LeetCode:位运算实现加法
LeetCode:位运算实现加法 写在前面 位运算符 实现加法的思路 两个加数,比如5(101)和6(110),如何不用加法就能得出两者之和呢? 我们知道二进制计算中,如果使用异或将会产生无进位的两者 ...
- 【LeetCode】位运算 bit manipulation(共32题)
[78]Subsets 给了一个 distinct 的数组,返回它所有的子集. Example: Input: nums = [,,] Output: [ [], [], [], [,,], [,], ...
- Apriori算法-位运算-C语言
原文地址:http://blog.csdn.net/liema2000/article/details/6118423 //////////////////////////////////////// ...
- Python这些位运算的妙用,绝对让你大开眼界
位运算的性能大家想必是清楚的,效率绝对高.相信爱好源码的同学,在学习阅读源码的过程中会发现不少源码使用了位运算.但是为啥在实际编程过程中应用少呢?想必最大的原因,是较为难懂.不过,在面试的过程中,在手 ...
- LeetCode刷题总结-双指针、位运算和分治法篇
本文总结LeetCode上有关双指针.位运算和分治法的算法题,推荐刷题总数14道.具体考点分析如下图: 一.双指针 1.字符串和数组问题 题号:424. 替换后的最长重复字符,难度中等 题号:828. ...
- C#LeetCode刷题-位运算
位运算篇 # 题名 刷题 通过率 难度 78 子集 67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...
- leetcode - 位运算题目汇总(下)
接上文leetcode - 位运算题目汇总(上),继续来切leetcode中Bit Manipulation下的题目. Bitwise AND of Numbers Range 给出一个范围,[m, ...
- leetcode - 位运算题目汇总(上)
最近在看位运算的知识,十分感叹于位运算的博大精深,正好leetcode有 Bit Manipulation 的专题,正好拿来练练手. Subsets 给出一个由不同的数字组成的数组,枚举它的子数组(子 ...
- LeetCode解题中位运算的运用
位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...
- LeetCode编程训练 - 位运算(Bit Manipulation)
位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...
随机推荐
- Bad Request - Invalid Hostname HTTP Error 400. The request hostname is invalid.
VS 调试 显示 如下错误 解决办法: 1 打开调试运行中的 IIS Express 2 点击其中一条记录 3 点击配置 4 找到对应项目站点 .添加 <binding protocol=&q ...
- ant build 报 warning modified in the future
错误原因:在测试项目时,修改了系统时间,之后保存了文件,再将系统时间改回来,会报这个错误 解决方法:复制改过的文件到记事本,然后回退下文件,再将记事本的内容覆盖下文件,重新build下就可以了.
- 点击事件触发count自增
1.vue3合成API :(即为什么要用setup() :为了数据更加关联) vue3 引入setup()合成API语法,它可以将某数据关联的内容整合到一个部分,即使setup里的内容越来越多也会围绕 ...
- 英码科技边缘计算智慧工地解决方案——给工地戴上AI“安全帽”
据统计显示,2021年全国共发生房屋市政工程生产安全事故734起,死亡840人:且近3年来,工地事故数量.死亡人数连续攀升.这不仅仅是一个普通的数字,每个数字都代表一个独特.鲜活的生命.为什么每年会发 ...
- nacos实现Java和.NetCore的服务注册和调用
用nacos作为服务注册中心,如何注册.NetCore服务,如何在Java中调用.NetCore服务呢?可以分为下面几个步骤: 0.运行nacos 1.开发.net core服务,然后调用nacos提 ...
- 【新版】使用 go-cqhttp 扫码登录,一键接入 ChatGPT 机器人到 QQ 群
目录 项目效果 安装 go-cqhttp 虚拟文件 启动 ChatGPT 项目效果 由于 ChatGPT 目前只能在漂亮国使用,所以想要在国内使用 ChatGPT 必然险阻重重 不仅时时刻刻要跟企鹅公 ...
- 对于MyBatis的模糊查询的实现+文本框、单选框以及复选框的数据回显的实现
MyBatis的模糊查询sql语句与之前使用的不太一样 主要是利用下面这种语句实现的(查了好久的,认真记一下吧!) select * from huodong where theme like con ...
- 音频和视频流最佳选择?SRT 协议解析及报文识别
我们所知道 SRT 是由 Haivision 和 Wowza 开发的开源视频流协议.很多人会认为在不久的将来,它被是 RTMP 的替代品.因为 RTMP 协议安全性稍低,延迟相对较高 ,而相对于 SR ...
- MATLAB信号处理常用函数(转载)
https://shimo.im/docs/YyRXY8cQdqY8RJvc/ <MATLAB信号处理工具箱>,可复制链接后用石墨文档 App 或小程序打开 嗯这个肯定是随便看看,有个印象 ...
- 百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)
目录 中国版ChatGPT上线发布 强大中文理解能力 智能文学创作.商业文案创作 图片.视频智能生成 中国生成式AI三大产业机会 新型云计算公司 行业模型精调公司 应用服务提供商 总结 获取文心一言邀 ...