位运算讲解

位运算讲解
🏝️专栏:https://blog.ZEEKLOG.net/2301_81831423/category_12845252.html
🌅主页:猫咪-9527-ZEEKLOG博客 

“欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。”

目录

目录

​编辑

1. 除法(乘法)转位运算

实际场景应用:

2. 按位与(&)确定资源状态

实际场景应用:资源分配

3. 按位或(|)改变资源状态

实际场景应用:占用资源

4. 按位与提取整型数字最后面的 1

实际场景应用:

5. 去掉整型数字最后面的 1

实际场景应用:

6. 异或(^)的小技巧

实际场景应用:交换两数值(无临时变量)

实际场景应用:异或加密

7. 补充技巧

实际场景应用:统计二进制中 1 的个数

实际场景应用:判断是否是 2^n

 实际场景应用:判断一个数的奇偶

8. 实际应用案例

位图法实现内存管理


1. 除法(乘法)转位运算

当数字的 除数(或 乘数)是 2的n次幂时,可以用移位操作代替除法或乘法:

修改后的值不发生变化

修改后x的值发生变化

实际场景应用:
  1. 位移处理数组索引:在大数组操作中,用移位快速计算内存地址。
  2. 音频/图像缩放:快速按倍数调整采样率或分辨率。

2. 按位与(&)确定资源状态

以二进制000101为例 当两个二进制都为1是为1,其余为0

            &000110

---------------------------

              000100

注:01也可以表示真假
实际场景应用:资源分配

以段页式存储为例,用二进制表示资源分配状态:

  • 1:已占用;
  • 0:空闲。
if (1 & (binary >> (n - 1))) { // 第 n 段已被占用 } else { // 第 n 段空闲 } 

补充示例:

用二进制记录一个8位灯的开关状态,例如 11001011

  • 若第 33 位是 1,表示灯开着;
  • 若是 0,表示灯关着。

判断某灯的状态:

if (binary & (1 << (3 - 1))) { // 第 3 盏灯开着 } else { // 第 3 盏灯关着 } 

3. 按位或(|)改变资源状态

以二进制000101为例                               当两个二进制都为0是为0,其余为1

            &000110

---------------------------

              000111

注:01也可以表示真假

通过按位或操作,修改资源状态。

实际场景应用:占用资源

将某段的状态设置为 1

binary = binary | (1 << (n - 1)); // 占用第 n 段资源 

释放资源:

将某段的状态设置为 0

binary = binary & ~(1 << (n - 1)); // 释放第 n 段资源 

示例:

假设 binary = 11001011,表示灯的开关状态。

关第 22 盏灯:

binary = binary & ~(1 << (2 - 1)); // 结果: 11001001 

开第 55 盏灯:

binary = binary | (1 << (5 - 1)); // 结果: 11101011 

4. 按位与提取整型数字最后面的 1

公式:

n&(−n)

注:如果这里看不懂请复习数据在计算机的存储

1.负数在计算机中存储的是补码
实际场景应用:
  • 查找最后一个有效位:用于低级数据结构操作(如位图、哈希表优化)。
  • 定位标志位:在状态标志中,提取某些重要的触发事件。

示例:

n = 18; // 二进制 10010 last_bit = n & (-n); // 结果: 10 (二进制) 

5. 去掉整型数字最后面的 1

公式:

n&(n−1)
实际场景应用:
  • 计数二进制中的 1 数量:常用于优化中断、状态分析等。
  • 移除标志位:动态调整任务状态。

示例:

n = 18; // 二进制 10010 n = n & (n - 1); // 结果: 10000 

6. 异或(^)的小技巧

实际场景应用:交换两数值(无临时变量)
a = a ^ b; b = a ^ b; a = a ^ b; 
实际场景应用:异或加密

异或操作常用于简单加密,例如:

key = 42; // 密钥 data = 123; // 原始数据 encrypted = data ^ key; // 加密 decrypted = encrypted ^ key; // 解密 

示例:

key = 42; // 101010 data = 123; // 1111011 encrypted = 123 ^ 42; // 1111011 ^ 101010 = 10111101 decrypted = 10111101 ^ 101010; // 1111011 

7. 补充技巧

实际场景应用:统计二进制中 1 的个数

通过移除最后一个 1 的方法高效统计:

int countOnes(int n) { int count = 0; while (n) { n = n & (n - 1); count++; } return count; } 
实际场景应用:判断是否是 2^n
n>0&&(n&(n−1))==0

注:想为2的n次幂说明只能比特位里面只能由一个1,其余均为0,(n&(n-1))可以去除最后的1,所以可以判断

示例:

n = 16; // 二进制 10000 if (n > 0 && (n & (n - 1)) == 0) { // 是 2 的幂 } else { // 不是 2 的幂 } 
 实际场景应用:判断一个数的奇偶
n&1==1为奇数

n&1==0为偶数 

综合运算小技巧:如何让一个数更快的变为1,这个数不可以含有小数运算

偶数运算:n>>=1

奇数运算: (n==3),n++                 原因:011  减1化为010,位运算01

                   (n>3),n++                   原因:111 加1化为1000,位运算更方便

                   普通奇数, n--;

8. 实际应用案例

位图法实现内存管理

假设有 32 个资源,状态存储在一个 32 位整型变量中:

  • 1 表示资源已分配;
  • 0 表示资源空闲。

分配资源

for (int i = 0; i < 32; i++) { if (!(resources & (1 << i))) { // 找到空闲资源 resources = resources | (1 << i); // 分配资源 break; } } 

释放资源

resources = resources & ~(1 << index); // 释放第 index 资源 

Read more

华为OD机试双机位C卷-符合条件的元组个数 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷-符合条件的元组个数 (C/C++/Py/Java/Js/Go)

求符合条件的元组个数 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 给定一个整数数组 nums、一个数字k,一个整数目标值 target,请问nums中是否存在k个元素使得其相加结果为target,请输出所有符合条件且不重复的k元组的个数 数据范围如下: * 2 ≤ nums.length ≤ 200 * -10^9 ≤ nums[i] ≤ 10^9 * -10^9 ≤ target ≤ 10^9 * 2 ≤ k ≤ 100 输入描述 第一行是nums取值:2 7 11 15 第二行是k的取值:2 第三行是target取值:9 输出描述 输出第一行是符合要求的元组个数:1 补充说明:

By Ne0inhk
Python从0到100(九十五):空洞卷积(Dilated Convolution)网络架构与PAMAP2数据集实验分析

Python从0到100(九十五):空洞卷积(Dilated Convolution)网络架构与PAMAP2数据集实验分析

前言:零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学业升学和工作就业的先行者! 【优惠信息】 • 新专栏订阅前500名享9.9元优惠 • 订阅量破500后价格上涨至19.9元 • 订阅本专栏可免费加入粉丝福利群,享受: - 所有问题解答 -专属福利领取 欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程! 本文目录: * 一、空洞卷积的基础原理 * 1. 传统卷积的短板 * 2. 空洞卷积的巧妙之处 * 二、空洞卷积的架构 * 1. 输入层 * 2. 空洞卷积模块 * 2.1 空洞卷积层 * 2.2 批归一化和激活 * 3. 整体结构 * 三、代码实现详解

By Ne0inhk
GitHub项目本地运行全攻略:从零到一掌握Python/Node.js/Java/Go实战部署与AI辅助开发

GitHub项目本地运行全攻略:从零到一掌握Python/Node.js/Java/Go实战部署与AI辅助开发

简介 无论你是编程新手还是资深开发者,本文将手把手教你如何从GitHub下载并运行项目,同时融入2025年最新企业级开发技术。从基础的项目下载与环境配置,到Python/Node.js/Java/Go项目的实战部署,再到结合GitHub Copilot Agent Mode和Docker容器化的高级应用,这篇文章将为你提供完整的开发流程指南。文末附赠完整代码和部署架构图,助你快速提升开发效率! 一、项目下载与基础配置 1.1 下载GitHub项目 在GitHub上找到你感兴趣的项目后,有三种主要方式下载到本地: 方式一:ZIP压缩包下载 点击项目页面右上角的绿色"Code"按钮,选择"Download ZIP"选项,将项目下载为压缩包。这种方法适合初学者,操作简单直观。解压后即可看到项目文件和目录结构。 打开GitHub项目页面点击绿色Code按钮选择Download ZIP下载项目压缩包解压文件到本地 方式二:Git命令克隆 对于熟悉Git的开发者,使用命令行克隆项目更为高效: # 先安装Git(如未安装)gitinstall#

By Ne0inhk