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

位运算知识

位运算是一种直接对整数在内存中的二进制位进行操作的运算方式。计算机中的整数是以二进制形式存储的,位运算通过操作这些二进制位来实现高效的计算。位运算通常比普通的算术运算更快,因为它直接作用于硬件层面。

以下是几种常见的位运算符及其功能:


1.按位与(`&`)

• 功能:对两个操作数的每一位进行逻辑与操作。只有当两个操作数的对应位都为1时,结果位才为1,否则为0。

• 示例:
  5 & 3
  5 的二进制表示:0101
  3 的二进制表示:0011
  结果:         0001
  十进制结果:   1
 

2.按位或(`|`)

• 功能:对两个操作数的每一位进行逻辑或操作。只要两个操作数的对应位中有一个为1,结果位就为1,否则为0。

• 示例:
  5 | 3
  5 的二进制表示:0101
  3 的二进制表示:0011
  结果:         0111
  十进制结果:   7
  

3.按位异或(`^`)

• 功能:对两个操作数的每一位进行逻辑异或操作。只有当两个操作数的对应位不同时,结果位才为1,否则为0。

• 示例:
  5 ^ 3
  5 的二进制表示:0101
  3 的二进制表示:0011
  结果:         0110
  十进制结果:   6
  

4.按位取反(`~`)

• 功能:对操作数的每一位进行逻辑取反操作。0变为1,1变为0。

• 示例:
  ~5
  5 的二进制表示:0101
  结果:         1010
  十进制结果:   -6(注意:取反后结果为负数,因为最高位是符号位)
  

5.左移(`<<`)

• 功能:将操作数的二进制表示向左移动指定的位数。左移一位相当于乘以2。

• 示例:
  5 << 1
  5 的二进制表示:0101
  左移一位:     1010
  十进制结果:   10
 

6.右移(`>>`)

• 功能:将操作数的二进制表示向右移动指定的位数。右移一位相当于除以2(向下取整)。

• 示例:
  5 >> 1
  5 的二进制表示:0101
  右移一位:     0010
  十进制结果:   2
  

位运算的用途


1.快速乘除

位移运算可以用来快速实现乘法和除法操作,尤其是乘以或除以2的幂次方。
示例:快速乘以8

int x = 5;
int result = x << 3; // 左移3位,等价于 x * 8
// result = 40

• 解释:左移3位相当于乘以\(2^3=8\)。
示例:快速除以4

int x = 20;
int result = x >> 2; // 右移2位,等价于 x / 4
// result = 5


• 解释:右移2位相当于除以\(2^2=4\)。


2.检查奇偶性

通过按位与操作可以快速判断一个数是奇数还是偶数。
示例:判断奇偶性

int x = 7;
if (x & 1) {cout << "奇数" << endl;
} else {cout << "偶数" << endl;
}
// 输出:奇数


• 解释:`x & 1`的结果为1表示`x`是奇数,为0表示`x`是偶数。


3.位掩码操作

位掩码可以用来设置、清除或检查特定的位。
示例:设置特定位

int x = 0b00001010; // 二进制表示为 10
int mask = 0b00000100; // 二进制表示为 4
int result = x | mask; // 按位或操作
// result = 0b00001110,即 14


• 解释:通过按位或操作,可以将`x`的第2位设置为1。


示例:清除特定位

int x = 0b00001110; // 二进制表示为 14
int mask = ~0b00000100; // 二进制表示为 0b11111011
int result = x & mask; // 按位与操作
// result = 0b00001010,即 10


• 解释:通过按位与操作,可以将`x`的第2位清零。


4.交换变量值

通过异或运算可以不使用临时变量交换两个变量的值。


示例:交换变量值


int a = 5;
int b = 7;
a ^= b; // a = a ^ b
b ^= a; // b = b ^ a
a ^= b; // a = a ^ b
// 现在 a = 7, b = 5


• 解释:

1. `a ^= b`:`a`变为`a ^ b`。

2. `b ^= a`:`b`变为`b ^ (a ^ b)`,即`a`。

3. `a ^= b`:`a`变为`(a ^ b) ^ a`,即`b`。


5.计算2的幂次方

通过左移运算可以快速计算2的幂次方。


示例:计算\(2^8\)

int result = 1 << 8; // 左移8位
// result = 256


• 解释:左移8位相当于\(2^8\)。


6.检查是否为2的幂次方

一个数是2的幂次方当且仅当它只有一个位是1。可以通过`x & (x - 1)`来判断。


示例:检查是否为2的幂次方

int x = 256;
if (x & (x - 1) == 0 && x != 0) {cout << x << " 是2的幂次方" << endl;
} else {cout << x << " 不是2的幂次方" << endl;
}
// 输出:256 是2的幂次方


• 解释:

• 如果`x`是2的幂次方,`x`的二进制表示只有一个1。

• `x - 1`的二进制表示会将这个1变成0,并将后面的位变成1。

• 因此,`x & (x - 1)`的结果为0。

• 需要额外检查`x != 0`,因为0不是2的幂次方。


7.统计二进制中1的个数

可以通过逐位检查或使用内置函数来统计一个数的二进制表示中1的个数。


示例:统计1的个数

int x = 0b10101010; // 二进制表示为 170
int count = 0;
while (x) {count += x & 1; // 检查最低位是否为1x >>= 1; // 右移一位
}
// count = 4


• 解释:逐位检查最低位是否为1,然后右移一位,直到`x`为0。


总结

位运算是一种非常高效的操作方式,尤其在需要处理大量数据或优化性能时非常有用。通过上述示例,你可以看到位运算在快速乘除、奇偶性检查、位掩码操作、变量交换、计算2的幂次方、检查2的幂次方以及统计1的个数等场景中的应用。

相关文章:

位运算知识

位运算是一种直接对整数在内存中的二进制位进行操作的运算方式。计算机中的整数是以二进制形式存储的&#xff0c;位运算通过操作这些二进制位来实现高效的计算。位运算通常比普通的算术运算更快&#xff0c;因为它直接作用于硬件层面。 以下是几种常见的位运算符及其功能&…...

mybatis高级查询:一对多配置,一次性查出主表和子表中的数据

一、MyBatis高级查询&#xff1a;一对多 MyBatis是一款强大的持久层框架&#xff0c;提供了多种方式来处理关联查询&#xff0c;其中包括一对一和一对多的情况。在本文中&#xff0c;我们将深入探讨一对多关联查询的实现方式。 在MyBatis中配置一对多关系通常涉及到associati…...

美团2024年春招第一场笔试 C++

目录 1&#xff0c;小美的平衡矩阵 2&#xff0c;小美的数组询问 3&#xff0c;小美的MT 4&#xff0c;小美的朋友关系 1&#xff0c;小美的平衡矩阵 【题目描述】 给定一个n*n的矩阵&#xff0c;该矩阵只包含数字0和1。对于 每个i(1<i<n)&#xff0c;求在该矩阵中&am…...

XHTMLConverter把docx转换html报java.lang.NullPointerException异常

一.报错 1.报错信息 org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerExceptionat org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:77)at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConve…...

OpenCV 图形API(52)颜色空间转换-----将 NV12 格式的图像数据转换为 RGB 格式的图像

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 NV12 (YUV420p) 色彩空间转换为 RGB。该函数将输入图像从 NV12 色彩空间转换到 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图…...

pojovoDto等概念

Java 中的数据模型概念 POJO (Plain Old Java Object) POJO 是最简单的 Java 对象&#xff0c;不依赖于特定的框架&#xff0c;不实现任何特殊的接口&#xff0c;也不继承特定的类。 特点 具有无参构造函数属性使用 private 修饰提供公共的 getter 和 setter 方法可序列化 …...

COdeTop-206-反转链表

题目 206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 …...

线段树讲解(小进阶)

目录 前言 一、线段树知识回顾 线段树区间加减 区间修改维护&#xff1a; 区间修改的操作&#xff1a; 区间修改update&#xff1a; 线段树的区间查询 区间查询&#xff1a; 区间查询的操作&#xff1a; 递归查询过程&#xff1a; 区间查询query&#xff1a; 代码&…...

4082P 信号/频谱分析仪

——新利通仪器仪表—— 4082P丨信号/频谱分析仪 2Hz&#xff5e;110GHz Ceyear 4082系列信号/频谱分析仪在显示平均噪声电平、相位噪声、互调抑制、动态范围、幅度精度和测试速度等方面具备极佳的射频性能。具备强大的频谱分析、符合标准的功率测量套件、I/Q分析、瞬态分析…...

夏季跑步注意

夏季跑步注意 医学专家警示&#xff1a;大众跑者需以安全为先&#xff0c;警惕高温环境下“盲目冲刺”的风险。一些事件再次印证马拉松适宜气温为6-15℃&#xff0c;超过20℃时需主动降速并增加补水量。 所以建议每一位跑友&#xff0c;为了健康的跑步&#xff0c;每年除了做…...

openharmony5.0.0中C++公共基础类测试-线程相关(一)

C公共基础类测试及源码剖析 延续传统&#xff0c;show me the code&#xff0c;除了给出应用示例还重点分析了下openharmony中的实现。 简介 openharmony中提供了C公共基础类库&#xff0c;为标准系统提供了一些常用的C开发工具类&#xff0c;本文分析其实现&#xff0c;并给…...

TDengine 数据订阅设计

简介 数据订阅作为 TDengine 的一个核心功能&#xff0c;为用户提供了灵活获取所需数据的能力。通过深入了解其内部原理&#xff0c;用户可以更加有效地利用这一功能&#xff0c;满足各种实时数据处理和监控需求。 基本概念 主题 与 Kafka 一样&#xff0c;使用 TDengine 数…...

python:mido 提取 midi文件中某一音轨的音乐数据

pip install mido 使用 mido库可以方便地处理 MIDI 文件&#xff0c;提取其中音轨的音乐数据。 1.下面的程序会读取指定的 MIDI 文件&#xff0c;并提取指定编号音轨的音乐数据&#xff0c;主要包括音符事件等信息。 编写 mido_extract.py 如下 # -*- coding: utf-8 -*- &…...

vue3 中推荐使用的页面布局方式

1、Flexbox布局 原理 Flexbox&#xff08;弹性盒子布局模型&#xff09;提供了一种更加高效的方式来对容器中的子元素进行布局、对齐和分配空间。它能够根据容器的大小和子元素的内容自动调整布局&#xff0c;非常适合一维布局&#xff08;水平或垂直方向&#xff09;。 优…...

URP-UGUI交互功能实现

一、非代码层面实现交互&#xff08;SetActive&#xff09; Button &#xff1a;在OnClick&#xff08;&#xff09;中添加SetActive方法&#xff08;但是此时只首次有效&#xff09; Toggle &#xff1a;在OnClick&#xff08;&#xff09;中添加动态的SetActive方法 &#…...

UniGoal 具身导航 | 通用零样本目标导航 CVPR 2025

UniGoal的提出了一个通用的零样本目标导航框架&#xff0c;能够统一处理多种类型的导航任务 &#xff08;如对象类别导航、实例图像目标导航和文本目标导航&#xff09;&#xff0c;而无需针对特定任务进行训练或微调。 它的特点是 图匹配与多阶段探索策略&#xff01;&#x…...

通过Quartus II实现Nios II编程

目录 一、认识Nios II二、使用Quartus II 18.0Lite搭建Nios II硬件部分三、软件部分四、运行项目 一、认识Nios II Nios II软核处理器简介 Nios II是Altera公司推出的一款32位RISC嵌入式处理器&#xff0c;专门设计用于在FPGA上运行。作为软核处理器&#xff0c;Nios II可以通…...

Linux/AndroidOS中进程间的通信线程间的同步 - IPC方式简介

前言 从来没有总结过Linux/Android系统中进程间的通信方式和线程间的同步方式&#xff0c;这个专栏就系统总结讨论一下。首先从标题可知&#xff0c;讨论问题的主体是进程和线程、通信和同步&#xff1b;在这里默认你理解进程和线程的区别。通信和同步有什么概念上的区别&…...

Windows:注册表配置应用

0、简介 本篇博客记录一下&#xff0c;日常的系统注册表配置选项&#xff0c;以防再次遇到问题不知如何解决。 1、开机启动配置 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run :: 此位置存储了所有用户登录时需要启动的程序。 在该项下新建字符串值&#…...

升级xcode16之后react-native-zip-archive不兼容,unsupported option ‘-G‘

问题 升级xcode到16之后,xcode build报错:unsupported option -G for target x86_64-apple-ios13.4-simulator (in target RNZipArchive from project Pods) 出现原因 在 React Native 项目中,当你将 Xcode 升级到 16 后,可能会遇到 RNZipArchive 相关的编译错误,特别是…...

WebXR教学 05 项目3 太空飞船小游戏

准备工作 自动创建 package.json 文件 npm init -y 安装Three.js 3D 图形库&#xff0c;安装现代前端构建工具Vite&#xff08;用于开发/打包&#xff09; npm install three vite 启动 Vite 开发服务器&#xff08;推荐&#xff09;&#xff08;正式项目开发&#xff09; …...

网页在浏览器中显示的原理(简要)

网页在浏览器中显示的过程是一个复杂的多阶段流程。 1. 输入URL并发起请求 用户在地址栏输入URL并回车 浏览器检查缓存&#xff08;DNS缓存、页面缓存等&#xff09; 如果没有缓存&#xff0c;通过DNS解析获取服务器IP地址 建立TCP连接&#xff08;三次握手&#xff09; 发…...

rl中,GRPO损失函数详解。

文章目录 **一、GRPO损失函数的设计背景****二、代码逐行解析****三、关键组件详解****1. 对数概率与KL散度计算****2. 优势值与策略梯度****3. 掩码与平均损失****四、训练动态与调参建议**在TRL(Transformer Reinforcement Learning)库中,GRPO(Group Relative Policy Opt…...

【Java面试笔记:基础】12.Java有几种文件拷贝方式?哪一种最高效?

在 Java 中,文件拷贝可以通过多种方式实现,不同方式的性能和适用场景有所差异。 1. Java 文件拷贝方式 传统 IO 方式 使用 FileInputStream 和 FileOutputStream,通过循环读取和写入数据实现文件拷贝。 示例代码: try (InputStream is = new FileInputStream("sou…...

【leetcode】3524 求出数组的X值1

题目链接 题目描述 给你一个正整数数组 nums 和一个正整数 k。 你可以对数组执行一次操作&#xff1a;移除不重叠的前缀和后缀&#xff08;可以为空&#xff09;&#xff0c;留下一个连续非空子数组。 对于每一种留下的子数组&#xff0c;计算&#xff1a; (该子数组的乘积…...

达梦统计信息收集情况检查

查询达梦某个对象上是否有统计信息 select id,T_TOTAL,N_SMAPLE,N_DISTINCT,N_NULL,BLEVEL,N_LEAF_PAGES,N_LEAF_USED_PAGES,LAST_GATHERED from sysstats where id IN (select id from sysobjects where upper(name)upper(&objname));可能有系统对象&#xff0c;可以增加…...

1️⃣5️⃣three.js_GUI辅助调试器

15、GUI辅助调试器 3D虚拟工厂在线体验 GUI辅助调试器将原本需要修改代码调整参数并刷新页面的操作,简化为直接在GUI中实时调整,实现所见即所得的效果。 导入GUI 库 //引入GUI辅助调试器 import {GUI } from three/addons/libs/lil-gui.module.min.js创建GUI辅助调试器对象 c…...

【matlab】气泡图的应用

【matlab】气泡图的应用 .rtcContent { padding: 30px; } .lineNode {font-size: 12pt; font-family: "Times New Roman", Menlo, Monaco, Consolas, "Courier New", monospace; font-style: normal; font-weight: normal; } clear load zb_equi.mat load …...

@Configuration注解对应实现implements WebMvcConfigurer的配置不生效问题。

检查项目是否有其他配置实现了 extends WebMvcConfigurationSupport&#xff0c;如果有就是这个配置导致实现implements WebMvcConfigurer的配置不生效。 我的问题项目有imgconfig&#xff0c;和webconfig Configuration public class ImgConfig extends WebMvcConfigurationS…...

飞帆控件:在编辑模式下额外加载的库

飞帆是一个自由的控件设计平台。在飞帆中&#xff0c;我们可以很方便地创建基于 Vue 2 组件的控件&#xff0c;并使用控件来搭建网页。 他山之石&#xff0c;可以攻玉。在创建控件中&#xff0c;使用 js 、css 依赖库能让我们的控件更强大。 有些时候&#xff0c;在编辑模式下…...