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

【位运算】位运算常用技巧总结

目录

前言

一.常见的小问题

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

2.给定一个数n,将它的二进制表示中的第x位修改成1

3.给定一个数n,将它的二进制表示中的第x位修改成0

4.给定一个数n,提取它的二进制表示中最右侧的1(即将其它位置位0)

5.给定一个数n,去掉它的二进制表示中最右侧的1

 6.异或运算的规则

二.典型例题


前言

位运算是一类常考的题型,关于位运算的操作符有以下几种:

按位取反(~)

左移操作符(<<)

右移操作符(>>)

按位与(&)

按位或 (|)

按位异或(^)

重点要区分&,|和^这几个操作符,按位与是有0则0,按位或是有1则1

按位异或相同为0,相异为1。也可以记成“无进位相加”,例如1+1=2, 因为是二进制所以变成0,但是不进位。

接下来介绍怎么利用这些操作符来解决常见的问题

一.常见的小问题

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

首先声明,默认最低位是第0位。

方法:将n右移x位,与1做按位与操作,若结果为1,则n的第x位是1,若结果是0,则第x位是0

说明:右移操作是为了将第x位移到最低位,方便与1的最低位按位与,而1的其它位全是0,有0则0,故其它位的结果肯定是0,而最低位的结果则取决于x位是0还是1

代码操作:(n >> x) & 1 

2.给定一个数n,将它的二进制表示中的第x位修改成1

方法:将1左移x位,再与n按位或

说明:将1左移x位是为了对n的第x位进行“定向打击”,1的第x位是1,其余位是0。按位或的特点是有1则1,故结果的第x位肯定是1,其它位取决于n的其它位是0还是1,和原来相比不会变化

代码操作:n = (1 << x) | n

3.给定一个数n,将它的二进制表示中的第x位修改成0

方法:将1左移x位,按位取反,再与n按位与

说明:按位与的特点是有0则0,故结果的第x位肯定是0,其它位取决于n的其它位是0还是1,和原来相比不会发生变化

代码操作:n = (~(1 >> x) ) & n

4.给定一个数n,提取它的二进制表示中最右侧的1(即将其它位置位0)

方法:n & -n 

说明:由n向-n转变,先将n按位取反,然后加1,这样使得n最右侧的1,左边区域全变成相反,右边区域全变成0,而按位与的特点是有0则0,故只有最右侧的1异或的结果是1,其余全是0。

5.给定一个数n,去掉它的二进制表示中最右侧的1

方法:n & (n - 1)

说明:由n到n-1,最右侧1的左边区域不变,右边区域(包括1)全部变成相反,按位与的特点是有0则0,故最右侧的1肯定会变成0,其余位不变

 6.异或运算的规则

a ^ 0 = a

a ^ a = 0

a ^ b ^ c = a ^ c ^ b 

二.典型例题

接下来有几道例题,大家可以先尝试做一做,答案放在下面了

位1的个数

class Solution {
public:int hammingWeight(uint32_t n) {int ret = 0;for (int i = 0; i <= 31; i++){if (((n >> i) & 1) == 1){ret++;}}return ret;}
};



比特位计数

class Solution {
public:vector<int> countBits(int n) {//x&(x-1)将x的最右侧的1变成0vector<int> v(n + 1);for (int i = 0; i <= n; i++){int x = i;int count = 0;while (x){count++;x = x & (x - 1);}v[i] = count;}return v;}
};



汉明距离

class Solution {
public:int hammingDistance(int x, int y) {int n = x ^ y;//统计有多少个1int ret = 0;while (n){ret++;n = n & (n - 1);}return ret;}
};



只出现一次的数字

class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for (int i = 0; i < nums.size(); i++){ret ^= nums[i];}return ret;}
};

只出现一次的数字iii

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {//目标:将两个单身狗分开,相同的数不拆散,再将两组分别异或//方法:根据两个单身狗任意一个不同的比特位来进行分组int n = 0;for (auto e : nums){n ^= e;}//找到比特位是1的位置--两个单身狗这一位不同int pos = 0;for (int i = 0; i <= 31; i++){if (((n >> i) & 1) == 1) {pos = i;break;}}//根据这一位置的值将所有数分成两组异或int ret1 = 0, ret2 = 0;for (auto e : nums){if (((e >> pos) & 1) == 0){ret1 ^= e;}else{ret2 ^= e;}}return {ret1, ret2};//隐式类型转换}
};

相关文章:

【位运算】位运算常用技巧总结

目录 前言 一.常见的小问题 1.给定一个数n,确定它的二进制表示中的第x位是0还是1 2.给定一个数n&#xff0c;将它的二进制表示中的第x位修改成1 3.给定一个数n&#xff0c;将它的二进制表示中的第x位修改成0 4.给定一个数n&#xff0c;提取它的二进制表示中最右侧的1&…...

【STM32】IIC使用中DMA传输时 发送数据总少一个的问题

问题描述 在使用STM32 I2C数据发送过程中&#xff0c;发现每轮实际发送出去的数据总比在DMA配置中设定的传输数据个数要少一个。比方说&#xff1a;DMA配置里设定的传输数据个数是10个&#xff0c;结果发现在总线上只能发出9个&#xff0c;经过进一步发现是少了最后一个数据。…...

记录layui数据表格使用文件上传按钮

一、前言 虽然用到这种的情况不多&#xff0c;但是还是记录下 二、相关代码 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html;charsetutf-8"/><meta name"renderer" content&quo…...

c++之枚举

1、背景 在开发代码的过程中&#xff0c;vector类型数组a的index取了一个枚举值CTR&#xff0c;eg&#xff1a;a[CTR]&#xff0c;刚开始以为是map类型&#xff0c;后面看不是&#xff0c;简单的看了下c的enum类型&#xff0c;原来enum按顺序默认为数字。 2、enum简介 2.1、…...

LeetCode 热题 100(七):105. 从前序与中序遍历序列构造二叉树、14. 二叉树展开为链表

题目一&#xff1a; 105. 从前序与中序遍历序列构造二叉树https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 思路&#xff1a;依据前序遍历的根左右和中序遍历的左根右&#xff0c; 且根左长度&#xff1d;左根 代码&#xff1a; …...

机器学习笔记 - 在表格数据上应用高斯混合GMM和网格搜索GridSearchCV提高分类精度的机器学习案例

1、需求及数据集说明 这是一项二分类任务,评估的是分类准确性(正确预测的标签百分比)。训练集有1000个样本,测试集有9000个样本。你的预测应该是一个9000 x 1的向量。您还需要一个Id列(1到9000),并且应该包括一个标题。格式如下所示: Id,Solution 1,0 2,1 3,1 ... 900…...

【UE 材质】模型部分透明

材质节点如下&#xff0c;这里简单解释一下。首先通过“Mask”节点将"Texture Coordinate" 节点中的“G”通道分离出来&#xff0c;然后通过“if”节点进行判断&#xff0c;当值小于0.5时为透明&#xff0c;当颜色不小于5时为不透明。可以通过一个参数来控制模型透明…...

Web3 社交平台如何脱颖而出?我们和 PoPP 聊了聊

能够颠覆 Web2 传统模式的社交产品有着怎样的特征&#xff1f;PoPP 作为专注于 Web3 的私域流量变现平台&#xff0c;为开发者和用户提供了社交产品发展的新路径&#xff0c;让社区用户充分实现互动交流&#xff0c;着力于创作内容的激励与变现。事实上&#xff0c;面对 Web3 社…...

【Android】ARouter新手快速入门

什么是ARouter ARouter是阿里巴巴推出的一款android界面路由框架 ARouter解决的核心问题是什么 在大型的模块化项目中&#xff0c;一个模块&#xff0c;往往无法直接访问到其它模块中的类&#xff0c;必须通过其它方式来完成模块间的调用 ARouter的核心功能在于&#xff0c…...

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十一:通用表单组件封装实现

一、本章内容 本章实现通用表单组件,根据实体配置识别实体属性,并自动生成编辑组件,实现对应数据填充、校验及保存等逻辑。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址:...

Oracle Scheduler学习

参考文档&#xff1a; Primary Note: Overview of Oracle Scheduler (Doc ID 1485539.1) Oracle Database Administrators Guide 12c Release 1 (12.1) E17636-21 Chapter(30) Administering Oracle Scheduler Examples of Using the Scheduler http://docs.oracle.com/cd/E166…...

用户体验地图是什么?UX设计心得分享

大家好&#xff0c;我是设计师l1m0身。本篇文章是关于UX设计中的用户体验地图。 对于新手设计师来说&#xff0c;建立用户体验地图会有一些难度。本篇文章中&#xff0c;我会以简单、易懂的语言分享UX设计师如何制作用户体验地图&#xff0c;希望对你的日常项目体验提升有所帮…...

vue3动态路由警告问题

{ path: "/:pathMatch(.*)*", // 必备 component: () > import("/views/error/404.vue"), }, 路由里添加...

17 Linux之大数据定制篇-Shell编程

17 Linux之大数据定制篇-Shell编程 文章目录 17 Linux之大数据定制篇-Shell编程17.1 Shell编程简介17.1.1 为什么要学习Shell编程17.1.2 Shell是什么17.1.3 执行Shell脚本 17.2 Shell的变量17.2.1 Shell变量介绍17.2.2 设置环境变量17.2.3 位置参数变量17.2.4 预定义变量 17.3 …...

SpringBoot集成WebSocket

SpringBoot集成WebSocket 项目结构图 项目架构图 前端项目 socket.js 注意前端这里的端口是9000, 路劲是ws开头 function createScoket(token){var socket;if(typeof(WebSocket) "undefined") {console.log("您的浏览器不支持WebSocket");}else{var ho…...

Linux服务器部署JavaWeb后端项目

适用于&#xff1a;MVVM前后台分离开发、部署、域名配置 前端&#xff1a;Vue 后端&#xff1a;Spring Boot 这篇文章只讲后端部署&#xff0c;前端部署戳这里 目录 Step1&#xff1a;服务器上搭建后端所需环境1、更新服务器软件包2、安装JDK83、安装MySQL4、登录MySQL5、修…...

原生小程序 wxs 语法(详细)

WXS WXS&#xff08;WeiXin Script&#xff09;是内联在 WXML 中的脚本段。通过 WXS 可以在模版中内联少量处理脚本&#xff0c;丰富模板的数据预处理能力。另外&#xff0c; WXS 还可以用来编写简单的 WXS 事件响应函数。 从语法上看&#xff0c; WXS 类似于有少量限制的 Java…...

MySQL中count(*)和count(1)和count(column)使用比较

分页查询数据&#xff0c;需要返回total&#xff0c;而这个值一般都是通过count函数实现。但是&#xff0c;针对count函数&#xff0c;有多种写法&#xff0c;如count(*)、count(1) 和 count(column)等。本文主要介绍以上几种写法的差异。 注意&#xff0c;这里仅针对MySQL数据…...

python用 xlwings库对Excel进行 字体、边框设置、合并单元格, 版本转换等操作

xlwings 其他的一些单元格读取写入操作网上很多&#xff0c; 下面就写些如何设置单元格的 字体对齐&#xff0c;字体大小、边框&#xff0c; 合并单元格&#xff0c; 这些设置。 import xlwings as xwapp xw.App(visibleTrue, add_bookFalse) app.display_alerts False #…...

Golang 中的 archive/zip 包详解(二):常用类型

Golang 中的 archive/zip 包用于处理 ZIP 格式的压缩文件&#xff0c;提供了一系列用于创建、读取和解压缩 ZIP 格式文件的函数和类型&#xff0c;使用起来非常方便。 zip.File 类型 定义如下&#xff1a; type File struct {FileHeaderzip *Readerzipr io…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...