位运算的总结--奇思妙解

目录

前言

先回顾常用的位运算

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

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

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

 4:与位图联系

5:提取一个数(n)二进制表示中最右侧的 1(重要)

6:干掉一个数(n)二进制表示中最右侧的 1(重要)

7:要考虑位运算的优先级吗?(了解)

8:异或(^)运算的运算律(重要)

9:对于~的妙用实现++/--(知道有就行)


前言

在这篇文章中,我将总结我所知道的所有位运算的独特之处。这些妙用非常重要,运用得当可以显著减少代码量,并提高时间和空间的效率。

位运算是计算机科学中的一种基础操作,其高效性和简洁性使其在许多场景中都能发挥重要作用。掌握位运算的技巧,不仅能够优化算法,还能提升程序的整体性能。

接下来,我将介绍几种常见的位运算技巧及其应用场景。

先回顾常用的位运算

符号描述运算规则
&按位与两个位都为1时,结果才为1
|按位或两个位都为0时,结果才为0
^按位异或两个位相同为0,相异为1
~取反0变1,1变0
<<左移各二进位全部左移若干位,高位丢弃,低位补0
>>右移各二进位全部右移若干位,高位补0或符号位补齐

记忆技巧:

 

符号记忆技巧
&全一则一
|有一则一
^有一则一,全一则零 / 相同为零,相异为一 / 无进制位相加

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

需要用到的运算符:>> &

操作:

 (n >> x) & 1

如果结果是1,则第x位为1

如果结果为0,则第x位位0

大致解释:

比如n的二进制为01101101, x为2

注意:

第0为为1!!!是从下标为0开始数的!!!

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

需要用到的运算符:>> |

操作:

n |= (1 << x)

大致解释:

比如n的二进制为01101101, x为1

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

需要用到的运算符:>> & ~

操作:

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

大致解释:

比如n的二进制为01101101, x为2

 4:与位图联系

其实上面这三种妙解都是可以与位图联系在一起,比方说根据上面这三种方法

在添加上位图的思想,就可以解决下面这三道题。

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

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

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

使用位图的思想,并不是使用bitset,而是使用其思想,比如下面使用位图的思想解决338。

class Solution {
public:vector<int> countBits(int n) {vector<int> v;for(int i=0;i<=n;i++){int t=i;int ret=0;while(t){t&=(t-1);ret++;}v.push_back(ret);}return v;}
};

5:提取一个数(n)二进制表示中最右侧的 1(重要)

需要用到的运算符:&

操作:

n & (-n)

其中的 -n 就是,将最右侧的 1,左边的区域全部变成相反。

需要注意的是,不要想当然去写 -n 的二进制编码,负数的二进制编码,用其正数去求反码,补码。补码才是二进制编码。

大致解释:

比如n为0110101000

6:干掉一个数(n)二进制表示中最右侧的 1(重要)

需要用到的运算符:&

操作:

n &= (n-1)

其中的n-1,就是将n最右侧的 1,其右边的区域(包含1)全部变成相反

大致解释:

7:要考虑位运算的优先级吗?(了解)

答案是,其实不需要考虑的,对于优先级其中由很多,记忆起来是不容易的,那么对于优先级的问题解决,我们只需要对应的位置添加上括号即可。

所以

能加括号就多加括号,拿不准的优先级问题,不需要考虑,直接添加括号解决问题。

8:异或(^)运算的运算律(重要)

对于异或(^)就没有太多要用的了

就有三个

 这里为了印象深刻点,就多举例一些常用的异或案例

利用或操作 | 和空格将英文字符转换为小写

('a' | ' ') = 'a'
('A' | ' ') = 'a'

利用与操作 & 和下划线将英文字符转换为大写 

('b' & '_') = 'B'
('B' & '_') = 'B'

利用异或操作 ^ 和空格进行英文字符大小写互换 

('d' ^ ' ') = 'D'
('D' ^ ' ') = 'd'

以上操作能够产生奇特效果的原因在于 ASCII 编码。字符其实就是数字,恰巧这些字符对应的数字通过位运算就能得到正确的结果,有兴趣的读者可以查 ASCII 码表自己算算,本文就不展开讲了。

判断两个数是否异号

int x = -1, y = 2;
bool f = ((x ^ y) < 0); // trueint x = 3, y = 2;
bool f = ((x ^ y) < 0); // false

这个技巧还是很实用的,利用的是补码编码的符号位。如果不用位运算来判断是否异号,需要使用 if else 分支,还挺麻烦的。读者可能想利用乘积或者商来判断两个数是否异号,但是这种处理方式可能造成溢出,从而出现错误。

交换两个数

void swap(int &a, int &b) 
{ a ^= b ^= a ^= b; 
}


那么给出两个题,使用异或来解决吧

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

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

9:对于~的妙用实现++/--(知道有就行)

  1. 加一
    int n = 1;
    n = -~n;
    // 现在 n = 2
    
  2. 减一
    int n = 2;
    n = ~-n;
    // 现在 n = 1
    

    其实这俩没什么实际作用,大家了解了解乐呵一下就行,知道有这个就行。

 

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

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

相关文章

语音识别flask接口开发

要开发一个flask语音识别接口&#xff0c;首先要解决语音文件在网络中的传输问题&#xff0c;然后选识别算法进行识别 文章目录 1、以二进制文件流方式上次语音2、网页端长连接流式上传语音文件3、语音识别接口 1、以二进制文件流方式上次语音 python服务端代码&#xff0c;以…

Kafka怎么发送JAVA对象并在消费者端解析出JAVA对象--示例

1、在pom.xml中加入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId><version>3.1.6</version></dependency> 2、配置application.yml 加入Kafk…

JS中的原型链与继承

原型链的类比 JS中原型链&#xff0c;本质上就是对象之间的关系&#xff0c;通过protoype和[[Prototype]]属性建立起来的连接。这种链条是动态的&#xff0c;可以随时变更。 这个就跟C/C中通过指针建立的关系很相似&#xff0c;比如&#xff0c;通过指针建立一个链表&#xf…

CSS学习记录04

CSS边框 CSS border 属性指定元素边框的样式、宽度和颜色。border-style 属性指定要显示的边框类型。dotted - 定义点线边框dashed - 定义虚线边框solid - 定义实线边框double - 定义双边框groove - 定义3D坡口边框&#xff0c;效果取决于border-color值ridge - 定义3D脊线边框…

一文了解模式识别顶会ICPR 2024的研究热点与最新趋势

简介 对模式识别研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICPR 2024的研究热点与最新趋势&#xff0c;帮助读者了解和跟踪模式识别的前沿研究方向。本推文的作者是黄星宇&#xff0c;审校为邱雪和许东舟。 一、会议介绍 ICPR…

福昕PDF低代码平台

福昕PDF低代码平台简介 福昕PDF 低代码平台是一款创新的工具&#xff0c;旨在简化PDF处理和管理的流程。通过这个平台&#xff0c;用户可以通过简单的拖拽界面上的按钮&#xff0c;轻松完成对Cloud API的调用工作流&#xff0c;而无需编写复杂的代码。这使得即使没有编程经验的…

oracle 11g中如何快速设置表分区的自动增加

在很多业务系统中&#xff0c;一些大表一般通过分区表的形式来实现数据的分离管理&#xff0c;进而加快数据查询的速度。分区表运维管理的时候&#xff0c;由于人为操作容易忘记添加分区&#xff0c;导致业务数据写入报错。所以我们一般通过配置脚本或者利用oracle内置功能实现…

Antd X : 迅速搭建 AI 页面的解决方案

前言 随着 AI 热度的水涨船高&#xff0c;越来越多的 AI 应用如井喷式爆发&#xff0c;那么如何迅速搭建一个 AI 应用的美观高质量 Web 前端页面呢&#xff0c; Antd 团队给出了一个解决方案。 X Ant DesIgn XAI 体验新秩序Ant Design 团队匠心呈现 RICH 设计范式&#xff0…

SD Express 卡漏洞导致笔记本电脑和游戏机遭受内存攻击

Positive Technologies 最近发布的一份报告揭示了一个名为 DaMAgeCard 的新漏洞&#xff0c;攻击者可以利用该漏洞利用 SD Express 内存卡直接访问系统内存。 该漏洞利用了 SD Express 中引入的直接内存访问 (DMA) 功能来加速数据传输速度&#xff0c;但也为对支持该标准的设备…

波特图方法

在电路设计中&#xff0c;波特图为最常用的稳定性余量判断方法&#xff0c;波特图的根源是如何来的&#xff0c;却鲜有人知。 本章节串联了奈奎斯特和波特图的渊源&#xff0c;给出了其对应关系和波特图相应的稳定性余量。 理论贯通&#xff0c;不在于精确绘…

React 组件中 State 的定义、使用及正确更新方式

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容React 组件中 State 的定义、使用及正确更新方式 前言 在 React 应用开发中&#xff0c;state …

C++(十二)

前言&#xff1a; 本文将进一步讲解C中&#xff0c;条件判断语句以及它是如何运行的以及内部逻辑。 一&#xff0c;if-else,if-else语句。 在if语句中&#xff0c;只能判断两个条件的变量&#xff0c;若想实现判断两个以上条件的变体&#xff0c;就需要使用if-else,if-else语…

查询产品所涉及的表有(product、product_admin_mapping)

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService1. 完整SQL分析可选部分&#xff08;条件筛选&#xff09;&#xff1a; 2. 涉及的表3. 总结4. 功能概述 查询指定管理员下所有产品所涉及的表&#xff1f;…

游戏引擎学习第36天

仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中&#xff0c;目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎&#xff0c;这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中&#xff0…

【SpringMVC】用户登录器项目,加法计算器项目的实现

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;用户登录项目实现 1&#xff1a;需求 2&#xff1a;准备工作 &#xff08;1&#xf…

3.5 认识决策树

3.5 认识决策树 3.5.1 认识决策树 如何高效的进行决策&#xff1f; 特征的先后顺序 3.5.2 决策树分类原理详解 已知有四个特征&#xff0c;预测 是否贷款给某个人。 先看房子&#xff0c;再看工作&#xff0c;是否贷款。 年龄&#xff0c;信贷情况&#xff0c;工作&#…

AI智能体Prompt预设词指令大全+GPTs应用使用

AI智能体使用指南 直接复制在AI工具助手中使用&#xff08;提问前&#xff09; 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档&#xff1a;Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用&#xff1a; 文章润色器 你是一位具有敏锐洞察…

K8S,StatefulSet

有状态应用 Deployment实际上并不足以覆盖所有的应用编排问题&#xff1f; 分布式应用&#xff0c;它的多个实例之间&#xff0c;往往有依赖关系&#xff0c;比如&#xff1a;主从关系、主备关系。 还有就是数据存储类应用&#xff0c;它的多个实例&#xff0c;往往都会在本地…

子类有多个父类的情况下Super不支持指定父类来调用方法

1、Super使用方法 super()函数在Python中用于调用父类的方法。它返回一个代理对象&#xff0c;可以通过该对象调用父类的方法。 要使用super()方法&#xff0c;需要在子类的方法中调用super()&#xff0c;并指定子类本身以及方法的名称。这样就可以在子类中调用父类的方法。 …

使用国内镜像源加速Qt“更新/安装”的方法

QT更新/安装时&#xff0c;国外源下载很慢&#xff0c;国内镜像源也因网络环境的不同而速度各异&#xff0c;下文给出国内镜像源的配置方法。 一、命令行 1、切换对应目录&#xff0c;更新器默认目录是 C:\Qt 2、文件名镜像源 安装示例&#xff1a; .\qt-unified-windows-x…