考试知识点位运算
深入理解位运算
在C++编程的世界里,位运算作为一种直接对二进制位进行操作的运算方式,虽然不像加减乘除等算术运算那样广为人知,却在许多关键领域发挥着至关重要的作用。从底层系统开发到高效算法设计,位运算都展现出其独特的魅力与强大的功能。同时,掌握一些位运算的小技巧,在考试涉及相关计算时能帮助我们快速得出答案。
一、位运算基础
(一)按位与(&)
按位与运算会对两个操作数对应的二进制位进行比较,只有当两个对应位都为1时,结果位才为1,否则为0。例如,5(二进制为00000101)与3(二进制为00000011)进行按位与运算:
#include <iostream>
int main() {int a = 5;int b = 3;int result = a & b;std::cout << "5 & 3 的结果是: " << result << std::endl;return 0;
}
在这个例子中,00000101与00000011按位与后得到00000001,即结果为1。按位与运算常用于掩码操作,比如提取一个整数特定的二进制位。
(二)按位或(|)
按位或运算与按位与相反,只要两个对应位中有一个为1,结果位就为1,只有当两个对应位都为0时,结果位才为0。还是以5和3为例:
#include <iostream>
int main() {int a = 5;int b = 3;int result = a | b;std::cout << "5 | 3 的结果是: " << result << std::endl;return 0;
}
00000101与00000011按位或后得到00000111,即结果为7。按位或运算常被用于设置某些二进制位为1。
(三)按位异或(^)
按位异或运算当两个对应位不同时,结果位为1,相同时结果位为0。同样对5和3进行操作:
#include <iostream>
int main() {int a = 5;int b = 3;int result = a ^ b;std::cout << "5 ^ 3 的结果是: " << result << std::endl;return 0;
}
00000101与00000011按位异或后得到00000110,即结果为6。按位异或有一个有趣的特性,就是对同一个数进行两次异或操作会得到原数,这在数据加密等领域有应用。
(四)按位取反(~)
按位取反是一元运算符,它将操作数的每一位都取反,0变为1,1变为0。例如对5进行按位取反:
#include <iostream>
int main() {int a = 5;int result = ~a;std::cout << "~5 的结果是: " << result << std::endl;return 0;
}
5的二进制00000101取反后得到11111010,在有符号整数表示中,这是一个负数(-6)。
(五)左移(<<)和右移(>>)
左移运算符(<<)将操作数的二进制位向左移动指定的位数,右边空出的位补0。例如,3(二进制00000011)左移2位:
#include <iostream>
int main() {int a = 3;int result = a << 2;std::cout << "3 << 2 的结果是: " << result << std::endl;return 0;
}
00000011左移2位后变为00001100,即结果为12。左移操作相当于对整数乘以2的移动位数次方。
右移运算符(>>)则将操作数的二进制位向右移动指定的位数。对于无符号整数,左边空出的位补0;对于有符号整数,若为正数左边补0,若为负数左边补1(算术右移)。例如,12(二进制00001100)右移2位:
#include <iostream>
int main() {int a = 12;int result = a >> 2;std::cout << "12 >> 2 的结果是: " << result << std::endl;return 0;
}
00001100右移2位后变为00000011,即结果为3。右移操作相当于对整数除以2的移动位数次方(向下取整)。
二、考试计算小技巧
(一)巧用左移快速乘2的幂
在考试中,如果遇到需要计算一个整数乘以2的幂次方的情况,使用左移运算符会非常高效。例如,计算5乘以8(即2的3次方),常规乘法计算可能需要花费一定时间,但用位运算就简单很多。因为5的二进制是00000101,左移3位后变成00101000,对应的十进制数就是40。所以在草稿纸上简单写下二进制数并进行左移操作,就能快速得出答案,比传统乘法计算更节省时间。
(二)右移实现快速整除2的幂
与左移对应,右移可以快速实现整除2的幂次方的计算。比如计算24除以4(即2的2次方),24的二进制是00011000,右移2位后变为00000110,也就是十进制的6。这种方法在处理除法运算且除数是2的幂时,能避免复杂的除法竖式计算,提高答题速度。
(三)按位与判断奇偶性
判断一个整数是奇数还是偶数,用按位与运算只需一步。因为奇数的二进制最低位是1,偶数的二进制最低位是0。所以将一个整数与1进行按位与运算,如果结果为1,则该数是奇数;如果结果为0,则该数是偶数。例如判断7的奇偶性,7的二进制是00000111,7 & 1的结果为1,所以7是奇数。这种技巧在涉及奇偶性判断的题目中,能快速给出答案,无需进行常规的取余运算。
(四)按位异或交换两个整数的值(无中间变量)
在一些编程概念或算法相关的考试题目中,可能会要求不使用中间变量交换两个整数的值。这时按位异或运算就派上用场了。假设有两个整数a和b,通过以下三步操作就能实现交换:
a = a ^ b;
b = a ^ b;
a = a ^ b;
例如a = 5(二进制00000101),b = 3(二进制00000011),第一步a = 5 ^ 3 = 6(二进制00000110);第二步b = 6 ^ 3 = 5(二进制00000101);第三步a = 6 ^ 5 = 3(二进制00000011),完成了a和b值的交换。在考试时遇到此类问题,使用这种方法能快速写出代码或给出解决方案。
三、位运算的实际应用
(一)状态标志管理
在程序中,经常需要表示多种状态。使用位运算可以用一个整数的不同二进制位来表示不同的状态,从而节省内存空间。例如,一个游戏角色可能有奔跑、跳跃、攻击等多种状态,用一个字节(8位)的整数就可以表示8种不同状态:
#include <iostream>
// 定义状态标志
const int RUNNING = 1 << 0;
const int JUMPING = 1 << 1;
const int ATTACKING = 1 << 2;int main() {int state = 0;// 角色开始奔跑state |= RUNNING;// 角色同时进行攻击state |= ATTACKING;// 检查角色是否在奔跑if (state & RUNNING) {std::cout << "角色正在奔跑" << std::endl;}// 检查角色是否在跳跃if (state & JUMPING) {std::cout << "角色正在跳跃" << std::endl;}// 检查角色是否在攻击if (state & ATTACKING) {std::cout << "角色正在攻击" << std::endl;}return 0;
}
(二)数据压缩与加密
位运算在数据压缩和加密算法中也扮演着重要角色。例如,在一些简单的加密算法里,可以利用按位异或运算的特性对数据进行加密和解密。假设密钥为一个固定整数,对数据的每个字节与密钥进行异或操作:
#include <iostream>
#include <vector>// 加密函数
std::vector<char> encrypt(const std::vector<char>& data, char key) {std::vector<char> encryptedData;for (char c : data) {encryptedData.push_back(c ^ key);}return encryptedData;
}// 解密函数
std::vector<char> decrypt(const std::vector<char>& encryptedData, char key) {return encrypt(encryptedData, key); // 异或两次回到原数据
}int main() {std::vector<char> originalData = {'h', 'e', 'l', 'l', 'o'};char key = 10;std::vector<char> encrypted = encrypt(originalData, key);std::vector<char> decrypted = decrypt(encrypted, key);std::cout << "原始数据: ";for (char c : originalData) {std::cout << c;}std::cout << std::endl;std::cout << "加密后数据: ";for (char c : encrypted) {std::cout << static_cast<int>(c) << " ";}std::cout << std::endl;std::cout << "解密后数据: ";for (char c : decrypted) {std::cout << c;}std::cout << std::endl;return 0;
}
(三)高效算法实现
在一些算法中,位运算可以显著提高运算效率。比如快速幂算法,用于计算一个数的幂次方。传统的累乘方法时间复杂度为O(n),而利用位运算的快速幂算法时间复杂度可降低到O(log n):
#include <iostream>
// 快速幂算法
long long fastPower(long long base, long long exponent) {long long result = 1;while (exponent > 0) {if (exponent & 1) {result *= base;}base *= base;exponent >>= 1;}return result;
}int main() {long long base = 3;long long exponent = 5;long long result = fastPower(base, exponent);std::cout << base << " 的 " << exponent << " 次方是: " << result << std::endl;return 0;
}
在这个算法中,通过位运算判断指数的二进制位是否为1,从而决定是否累乘当前的底数,同时通过右移指数和不断平方底数来快速计算幂次方。
位运算虽然相对复杂,但掌握它可以为C++编程带来更高的效率和更多的可能性。无论是在底层开发还是算法优化中,位运算都是不可或缺的重要工具,值得开发者深入学习和探索。同时,这些考试计算小技巧也能帮助我们在相关考试场景中更高效地答题,取得更好的成绩。
相关文章:

考试知识点位运算
深入理解位运算 在C编程的世界里,位运算作为一种直接对二进制位进行操作的运算方式,虽然不像加减乘除等算术运算那样广为人知,却在许多关键领域发挥着至关重要的作用。从底层系统开发到高效算法设计,位运算都展现出其独特的魅力与…...

matlab快速入门(2)-- 数据处理与可视化
MATLAB的数据处理 1. 数据导入与导出 (1) 从文件读取数据 Excel 文件:data readtable(data.xlsx); % 读取为表格(Table)CSV 文件:data readtable(data.csv); % 自动处理表头和分隔符文本文件:data load(data.t…...

Kafka中文文档
文章来源:https://kafka.cadn.net.cn 什么是事件流式处理? 事件流是人体中枢神经系统的数字等价物。它是 为“永远在线”的世界奠定技术基础,在这个世界里,企业越来越多地使用软件定义 和 automated,而软件的用户更…...

Python-列表
3.1 列表是什么 在Python中,列表是一种非常重要的数据结构,用于存储一系列有序的元素。列表中的每个元素都有一个索引,索引从0开始。列表可以包含任何类型的元素,包括其他列表。 # 创建一个列表my_list [1, 2, 3, four, 5.0]…...

51单片机开发:定时器中断
目标:利用定时器中断,每隔1s开启/熄灭LED1灯。 外部中断结构图如下图所示,要使用定时器中断T0,须开启TE0、ET0。: 系统中断号如下图所示:定时器0的中断号为1。 定时器0的工作方式1原理图如下图所示&#x…...

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
目录 1 -> HML语法 1.1 -> 页面结构 1.2 -> 数据绑定 1.3 -> 普通事件绑定 1.4 -> 冒泡事件绑定5 1.5 -> 捕获事件绑定5 1.6 -> 列表渲染 1.7 -> 条件渲染 1.8 -> 逻辑控制块 1.9 -> 模板引用 2 -> CSS语法 2.1 -> 尺寸单位 …...

算法【混合背包】
混合背包是指多种背包模型的组合与转化。 下面通过题目加深理解。 题目一 测试链接:1742 -- Coins 分析:这道题可以通过硬币的个数将其转化为01背包,完全背包和多重背包。如果硬币的个数是1个,则是01背包;如果硬币的…...

WordPress eventon-lite插件存在未授权信息泄露漏洞(CVE-2024-0235)
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

基于微信小程序的医院预约挂号系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

C++初阶 -- 手撕string类(模拟实现string类)
目录 一、string类的成员变量 二、构造函数 2.1 无参版本 2.2 有参版本 2.3 缺省值版本 三、析构函数 四、拷贝构造函数 五、c_str函数 六、operator重载 七、size函数 八、迭代器iterator 8.1 正常版本 8.2 const版本 九、operator[] 9.1 正常版本 9.2 const版…...

【Postman接口测试】Postman的安装和使用
在软件测试领域,接口测试是保障软件质量的关键环节之一,而Postman作为一款功能强大且广受欢迎的接口测试工具,能够帮助测试人员高效地进行接口测试工作。本文将详细介绍Postman的安装和使用方法,让你快速上手这款工具。 一、Pos…...

miniconda学习笔记
文章主要内容:演示miniconda切换不同python环境,安装python库,使用pycharm配置不同的conda建的python环境 目录 一、miniconda 1. 是什么? 2.安装miniconda 3.基本操作 一、miniconda 1. 是什么? miniconda是一个anac…...

区块链项目孵化与包装设计:从概念到市场的全流程指南
区块链技术的快速发展催生了大量创新项目,但如何将一个区块链项目从概念孵化成市场认可的产品,是许多团队面临的挑战。本文将从孵化策略、包装设计和市场落地三个维度,为你解析区块链项目成功的关键步骤。 一、区块链项目孵化的核心要素 明确…...

JavaScript的基本组成
1、JavaScript的组成部分 JavaScript可以分为三个部分:ECMAScript标准、DOM、BOM。 ECMAScript标准 即JS的基本语法,JavaScript的核心,描述了语言的基本语法和数据类型,ECMAScript是一套标 准,定义了一种语言…...

[Linux]从零开始的STM32MP157 U-Boot移植
一、前言 在上一次教程中,我们了解了STM32MP157的启动流程与安全启动机制。我们还将FSBL的相关代码移植成功了。大家还记得FSBL的下一个步骤是什么吗?没错,就是SSBL,而且常见的我们将SSBL作为存放U-Boot的地方。所以本次教程&…...

【Unity3D】实现横版2D游戏——攀爬绳索(简易版)
目录 GeneRope.cs 场景绳索生成类 HeroColliderController.cs 控制角色与单向平台是否忽略碰撞 HeroClampController.cs 控制角色攀爬 OnTriggerEnter2D方法 OnTriggerStay2D方法 OnTriggerExit2D方法 Update方法 开始攀爬 结束攀爬 Sensor_HeroKnight.cs 角色触发器…...

【llm对话系统】大模型 Llama 源码分析之 LoRA 微调
1. 引言 微调 (Fine-tuning) 是将预训练大模型 (LLM) 应用于下游任务的常用方法。然而,直接微调大模型的所有参数通常需要大量的计算资源和内存。LoRA (Low-Rank Adaptation) 是一种高效的微调方法,它通过引入少量可训练参数,固定预训练模型…...

算法随笔_35: 每日温度
上一篇:算法随笔_34: 最后一个单词的长度-CSDN博客 题目描述如下: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升…...

嵌入式硬件篇---CPUGPUTPU
文章目录 第一部分:处理器CPU(中央处理器)1.通用性2.核心数3.缓存4.指令集5.功耗和发热 GPU(图形处理器)1.并行处理2.核心数量3.内存带宽4.专门的应用 TPU(张量处理单元)1.为深度学习定制2.低精…...

STM32 PWM驱动舵机
接线图: 这里将信号线连接到了开发板的PA1上 代码配置: 这里的PWM配置与呼吸灯一样,呼吸灯连接的是PA0引脚,输出比较单元用的是OC1通道,这里只需改为OC2通道即可。 完整代码: #include "servo.h&quo…...

设计心得——平衡和冗余
一、平衡 在前面分析了一些软件设计的基础和原则后,今天分析一下整体设计上的一些实践问题。首先分析一下设计上的平衡问题。平衡非常好理解,看到过天平或者标称的同学们应该都知道什么平衡。无论在哪个环境里,平衡都是稳定的基础。 既然说到…...

webrtc协议详细解释
### 一、概述与背景 WebRTC(Web Real-Time Communication)最早由 Google 在 2011 年开源,旨在为浏览器与移动端应用提供客户端直连(点对点)方式进行实时音视频及数据传输的能力。传统的网络应用在进行高实时性音视频通…...
动手学强化学习(四)——蒙特卡洛方法
一、蒙特卡洛方法 蒙特卡洛方法是一种无模型(Model-Free)的强化学习算法,它通过直接与环境交互采样轨迹(episodes)来估计状态或动作的价值函数(Value Function),而不需要依赖环境动态…...

网络原理(3)—— 传输层详解
目录 一. 再谈端口号 二. UDP协议(用户数据报协议) 2.1 UDP协议端格式 2.2 UDP报文长度 2.3 UDP校验和 三. TCP协议(传输控制协议) 3.1 TCP协议段格式 3.2 核心机制 3.2.1 确认应答 —— “感知对方是否收到” 3.2.2 超时重传 3.3.3 连接管理 —— 三次握手与四…...

2025美赛美国大学生数学建模竞赛A题完整思路分析论文(43页)(含模型、可运行代码和运行结果)
2025美国大学生数学建模竞赛A题完整思路分析论文 目录 摘要 一、问题重述 二、 问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码(仅供参考) 4.1.4问题1样例代码运行结果&…...

Elasticsearch的开发工具(Dev Tools)
目录 说明1. **Console**2. **Search Profiler**3. **Grok Debugger**4. **Painless Lab**总结 说明 Elasticsearch的开发工具(Dev Tools)在Kibana中提供了多种功能强大的工具,用于调试、优化和测试Elasticsearch查询和脚本。以下是关于Cons…...

Python-基于PyQt5,pdf2docx,pathlib的PDF转Word工具
前言:日常生活中,我们常常会跟WPS Office打交道。作表格,写报告,写PPT......可以说,我们的生活已经离不开WPS Office了。与此同时,我们在这个过程中也会遇到各种各样的技术阻碍,例如部分软件的PDF转Word需要收取额外费用等。那么,可不可以自己开发一个小工具来实现PDF转…...

小程序-视图与逻辑
前言 1. 声明式导航 open-type"switchTab"如果没有写这个,因为是tabBar所以写这个,就无法跳转。路径开始也必须为斜线 open-type"navigate"这个可以不写 现在开始实现后退的效果 现在我们就在list页面里面实现后退 2.编程式导航…...

UE5制作视差图
双目深度估计开源数据集很多都是用UE制作的,那么我们自己能否通过UE制作自己想要的场景的数据集呢。最近花了点时间研究了一下,分享给需要的小伙伴。 主要使用的是UnrealCV插件,UnrealCV是一个开源项目,旨在帮助计算机视觉研究人…...

海浪波高预测(背景调研)
#新星杯14天创作挑战营第7期# ps:图片由通义千问生成 历史工作: 针对更高细粒度、更高精度的波浪高度预测任务: Mumtaz Ali 等人提出了一种多元线性回归模型(MLR-CWLS),该模型利用协方差加权最小二乘法&a…...