我爱学算法之—— 位运算(上)

常见位运算

对于位运算:

&:按位与,有00

|:按位或,有11

^:按位异或,相同为0、不同为1。(无进位相加)

~:二进制位按位取反。

对于位运算的常见使用:

1. 判断一个数n,二进制中第x位是0还是1

例如一个数n01001101,要判断第4位是0还是1(从低位数)

就可让01001101 按位与上00001000,这样如果第4位为0,结果就是0;如果第4位为1,结果就是1

所以,就可以判断**(n>>x) & 1**,结果为1就表示第x1;结果为0则表示第x位为0

2. 将一个数n,二进制第x位修改为1

例如一个数n01100100,要将第4位修改为1

就可以让01100100按位或上00001000,这里无论第4位是0还是1,结果都是1;而其他位异或上0都不变(1 | 0 = 10 | 0 = 0)。

00001000只需让1左移3位即可。

所以,修改二进制第x1,只需:n | (1<<x)

3. 将一个数n,二进制第x位修改为0

例如一个数n00101100,将第4位修改为0

就可以让00101100按位与上11110111;这样无论第4位是什么,结果都为1,而其他位按位与上1都不变(1 & 1 = 10 & 1 = 0

11110111,只需要让1左移4位,然后按位取反即可。

4. 位图

对于位图,简单来说就是使用一个bit位来表示状态(01

5. 提取一个数n二进制中最右侧的1

要提取一个数n二进制中最右侧的1,只需要n & (-n)即可。

例如:n01100100,而-n的补码(原码取反加一):10011011(取反)、10011100(加一)

通过观察,取反加一,就是最右侧的1的右侧不变,左侧取反。(右侧为0),再按位与即可提取最右侧的1

01100100 & 10011011结果就等于00000100

6. 去掉一个数n二进制中最右侧的1

有去掉一个数n二进制中最右侧的1,只需要n & (n-1)即可

例如n01011000,而n-1 : 01010111

通过观察,n-1本质就是让n最右侧1的右侧取反(由全0变全1),左侧不变;

再按位与,右侧结果都为0(和n一样);而左侧没有变化。

01011000 & 01010111 结果为01010000

7. 按位异或

对于按位异或,常见的使用:

  1. n ^ n = 0
  2. n ^ 0 = n
  3. a ^ b ^ c = a ^ (b ^ c)(支持交换律)

一、位1的个数

在这里插入图片描述

对于这道题,要获取一个数n二进制中设置位的个数(1的个数)

而我们可以通过n & (n - 1)的操作来去掉n二进制中最后的1,所以,就可以对n一直进行n = n & (n - 1)操作,直到n0

n &= (n - 1)的次数就是数n二进制中1的个数。

class Solution {
public:int hammingWeight(int n) {int ret = 0;while (n) {n &= (n - 1);ret++;}return ret;}
};

二、比特位计数

在这里插入图片描述

这道题,给定一个n要求,返回一个数组ansans中存储的是[0 , n]之间每个数二进制形式中1的个数。

简单来说就是,获取[0,n]中每个数二进制中1的个数。

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

三、汉明距离

在这里插入图片描述

对于这道题,给两个数xy,要求xy的汉明距离(二进制中不同位的数目)

简单来说就是求xy二进制中,不同bit位置的数目。

解题思路:

我们知道^操作,相同为0,不同为1;所以,x ^ y二进制中为1就表示xybit为不相同。

只需要判断x^y的二进制中1的个数即可。

class Solution {
public:int hammingDistance(int x, int y) {int tmp = x ^ y;int ret = 0;while (tmp) {tmp &= (tmp - 1);ret++;}return ret;}
};

四、只出现一次的数字

在这里插入图片描述

这道题,给定一个非空的数组nums,其他有一个元素只出现了一次,其他元素都出现了两次。

^操作:

  • n ^ 0 = n
  • n ^ n = 0

这里只需要将nums中所有元素都进行^即可,最终的结果就是只出现一次的元素(其他所有元素都出现了两次,^结果为0

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

五、只出现一次的数字 III

在这里插入图片描述

这道题给定一个数组nums,其中存在两个元素只出现了一次,其他所有的元素都出现了两次;

这里要我们返回这两个主出现了一次的元素。

解法一:

使用hash表统计数组中的元素和出现的次数;最后找出只出现一次的两个元素,然后返回。

解法二:

假设只出现的元素为xy,将数组中的所有元素进行^,最终结果为:x ^ y

  • 提取x ^ y二进制bit位最低位的1lowbit
  • (x ^ y)该bit位为1xybit位不相同(通过该bit位将xy区分开)
  • 再遍历nums数组,lowbit1的为一组,lowbit0的为一组(xy一定不在同一组)。
  • 获取xy,然后返回

在这里插入图片描述

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {int n = 0;for (auto& e : nums)n ^= e;int lowbit = (n == INT_MIN ? n : n & -n);vector<int> ret(2, 0);for (auto& e : nums) {if (e & lowbit) // 1ret[0] ^= e;elseret[1] ^= e;}return ret;}
};

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

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

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

相关文章

智能语音系统

智能语音系统通过技术手段让机器能够“听懂”、“理解”并“回应”人类的语音&#xff0c;是实现人机交互的关键技术之一。下面我将为你梳理智能语音系统的核心组成部分、工作原理、应用场景以及面临的挑战。&#x1f9e0; 核心技术与工作原理智能语音系统之所以能实现人机交互…

水泵自动化远程监测与控制的御控物联网解决方案

一、行业背景与痛点分析水泵作为工业生产、农业灌溉、城市供水等领域的核心设备&#xff0c;其运行效率直接影响系统稳定性与运营成本。然而&#xff0c;传统管理模式存在三大核心痛点&#xff1a;人工巡检低效&#xff1a;偏远地区水泵分布分散&#xff0c;依赖人工定期巡检&a…

Python实现点云法向量各种方向设定

本次我们分享点云法向量定向的四种方法&#xff0c;分别是XYZ轴、相机位置、最小生成树(MST)和质心设定方法。通常出现在三维点云处理、三维重建、计算机视觉或图形学中&#xff0c;需要估计点云的法向量方向。它们的核心任务是&#xff1a;在已知点坐标和局部几何结构&#xf…

腾讯云智能体开发平台

提供全球领先的云计算服务腾讯云&#xff0c;腾讯集团倾力打造的云计算品牌&#xff0c;面向全世界各个国家和地区的政府机构、企业组织和个人开发者&#xff0c;提供全球领先的云计算、大数据、人工智能等技术产品与服务&#xff0c;以卓越的科技能力打造丰富的行业解决方案&a…

css flex布局,设置flex-wrap:wrap换行后,如何保证子节点被内容撑高后,每一行的子节点高度一致。

flex布局&#xff0c;设置flex-wrap&#xff1a;wrap换行后&#xff0c;如何保证子节点被内容撑高后&#xff0c;每一行的子节点高度一致。核心&#xff1a;需要设置父节点和子节点&#xff1a;align-items: stretch&#xff0c;两个都要。代码&#xff1a;<div class"…

Nginx_Tomcat综合案例

要求 需求&#xff1a;通过 nginx 来代理两个 tomcat 服务器&#xff08;反向代理&#xff09;&#xff0c;然后通过 https://www.nginx.com 来进行访问。主机名IP软件nginx192.168.30.10nginxtomcat1192.168.30.11java&#xff0c;tomcattomcat2192.168.30.12java&#xff0c;…

【Vue2手录12】单文件组件SFC

一、知识回顾-Vue2项目基础操作与环境配置 1.1 项目启动 项目打开方式&#xff1a;直接将项目文件夹&#xff08;如my-app&#xff09;拖拽到 Visual Studio Code&#xff08;推荐编辑器&#xff09;&#xff0c;避免拖拽父级文件夹&#xff0c;防止路径混乱。启动命令&#xf…

VS2022下载+海康SDK环境配置实现实时预览

一.VS2022下载去官网下载就可以了&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/下载Community版本是免费的。&#xff08;2&#xff09;下载后得安装包VisualStudioSetup.exe打开&#xff1a;点击继续等待下载完成&#xff0c;出现如下界面&#xff0c;这里是选…

YOLO 模型从 PyTorch 转换为 ONNX 并优化

YOLO 模型从 PyTorch 转换为 ONNX 并优化 在深度学习部署中&#xff0c;ONNX&#xff08;Open Neural Network Exchange&#xff09; 已成为跨框架与跨平台的标准格式。我们经常需要将 YOLOv8 在 PyTorch 中训练好的模型转换为 ONNX&#xff0c;并进行优化&#xff0c;以便在 …

推进新型信息基础设施建设发展:蜂窝模组行业迎来结构性机遇

工信部副部长张云明在2025年9月9日国新办新闻发布会上明确表示&#xff0c;将"扎实推进新型信息基础设施建设发展"&#xff0c;并重点强调"打造新型工业网络&#xff0c;推进蜂窝车联网部署" 。这一政策表态对蜂窝模组行业产生深远影响&#xff0c;将推动行…

返利app排行榜的缓存更新策略:基于过期时间与主动更新的混合方案

返利app排行榜的缓存更新策略&#xff1a;基于过期时间与主动更新的混合方案 大家好&#xff0c;我是阿可&#xff0c;微赚淘客系统及省赚客APP创始人&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在返利APP中&#xff0c;“热门商品排行榜”“用…

科技信息差(9.12)

AI量子计算重塑药物研发&#xff1a;技术融合路径与产业革命一、引言&#xff1a;技术融合的颠覆性机遇2025年9月&#xff0c;AI药物研发公共服务平台正式上线&#xff0c;宣称可将新药上市时间缩短近半1。与此同时&#xff0c;量子计算与AI的跨界合作在KRAS抑制剂开发中取得突…

Java 分布式缓存实现:结合 RMI 与本地文件缓存

目录 一、核心思路 二、项目结构说明 2.1 服务端项目结构&#xff08;IDEA&#xff09; 2.2 客户端项目结构&#xff08;Eclipse&#xff09; 三、服务端实现&#xff08;IDEA&#xff09; 3.1 数据库访问层 3.2 远程接口定义 3.3 远程服务实现 3.4 服务端启动类 四、…

Electron第一个应用

1、安装node nodeJS下载 2、下载完成&#xff0c;需要配置环境。 写道path路径 、 3、安装完成&#xff0c;查看版本 npm -v4、 配置cnpm npm install -g cnpm --registryhttps://registry.npmmirror.com5、参考Electron 写&#xff1a; Electron第一个程序hello 6、安装…

React 原理篇 - React 新架构深度解析

使用过 React v16 之前版本的开发者或许都经历过这样的场景&#xff1a;当页面包含复杂组件或大量列表时&#xff0c;输入框打字会卡顿&#xff0c;滚动会不流畅。这些体验问题的背后&#xff0c;往往与 React 的渲染机制密切相关。2017 年 React v16 推出的 Fiber 架构&#x…

【JavaSE五天速通|第三篇】常用API与日期类篇

适合有其他语言基础想快速入门JavaSE的。用的资料是 Java入门基础视频教程 &#xff0c;从中摘取了笔者认为与其他语言不同或需要重点学习的内容 常用API与日期类只需要有印象即可&#xff0c;用到了再来这查 day04 常用API 一、StringBuilder类 StringBuilder代表可变字符…

K8s学习笔记(二) Pod入门与实战

1 K8s核心资源Pod 1.1 Pod是什么&#xff1f; 官方文档&#xff1a;Pod | Kubernetes Pod 是 Kubernetes&#xff08;k8s&#xff09;中最小的部署与调度单元&#xff0c;并非直接运行容器&#xff0c;而是对一个或多个 “紧密关联” 容器的封装。 核心特点可简单总结为 3 …

用 Python 调用 Bright Data MCP Server:在 VS Code 中实现实时网页数据抓取

用 Python 调用 Bright Data MCP Server&#xff1a;在 VS Code 中实现实时网页数据抓取&#xff0c;本文介绍了Bright Data的Web MCP Server&#xff0c;这是一款能实现实时、结构化网页数据访问的API&#xff0c;适用于AI应用等场景。其支持静态与动态网页&#xff0c;前3个月…

SPSS绘制ROC曲线并计算灵敏度、特异度

SPSS绘制ROC曲线并计算灵敏度、特异度。 &#xff08;1&#xff09;绘制ROC曲线&#xff1a; 输入&#xff1a;预测值、受试者标签。 在SPSS中点击“分析”-“分类”-“ROC曲线” 变量输入&#xff1a;检验变量输入预测值&#xff0c;状态变量输入受试者标签&#xff0c;如果标…

Modbus协议原理与Go语言实现详解

目录 Modbus协议概述协议架构与通信模式Modbus数据模型Modbus协议帧格式功能码详解Go Modbus库完整实现高级应用示例调试与故障排除 Modbus协议概述 Modbus是一种串行通信协议&#xff0c;由Modicon公司&#xff08;现施耐德电气&#xff09;于1979年开发&#xff0c;用于PL…