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

考试知识点位运算

深入理解位运算

在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编程的世界里&#xff0c;位运算作为一种直接对二进制位进行操作的运算方式&#xff0c;虽然不像加减乘除等算术运算那样广为人知&#xff0c;却在许多关键领域发挥着至关重要的作用。从底层系统开发到高效算法设计&#xff0c;位运算都展现出其独特的魅力与…...

matlab快速入门(2)-- 数据处理与可视化

MATLAB的数据处理 1. 数据导入与导出 (1) 从文件读取数据 Excel 文件&#xff1a;data readtable(data.xlsx); % 读取为表格&#xff08;Table&#xff09;CSV 文件&#xff1a;data readtable(data.csv); % 自动处理表头和分隔符文本文件&#xff1a;data load(data.t…...

Kafka中文文档

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

Python-列表

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

51单片机开发:定时器中断

目标&#xff1a;利用定时器中断&#xff0c;每隔1s开启/熄灭LED1灯。 外部中断结构图如下图所示&#xff0c;要使用定时器中断T0&#xff0c;须开启TE0、ET0。&#xff1a; 系统中断号如下图所示&#xff1a;定时器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 -> 尺寸单位 …...

算法【混合背包】

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

WordPress eventon-lite插件存在未授权信息泄露漏洞(CVE-2024-0235)

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

基于微信小程序的医院预约挂号系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

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的安装和使用

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

miniconda学习笔记

文章主要内容&#xff1a;演示miniconda切换不同python环境&#xff0c;安装python库&#xff0c;使用pycharm配置不同的conda建的python环境 目录 一、miniconda 1. 是什么&#xff1f; 2.安装miniconda 3.基本操作 一、miniconda 1. 是什么&#xff1f; miniconda是一个anac…...

区块链项目孵化与包装设计:从概念到市场的全流程指南

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

JavaScript的基本组成

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

[Linux]从零开始的STM32MP157 U-Boot移植

一、前言 在上一次教程中&#xff0c;我们了解了STM32MP157的启动流程与安全启动机制。我们还将FSBL的相关代码移植成功了。大家还记得FSBL的下一个步骤是什么吗&#xff1f;没错&#xff0c;就是SSBL&#xff0c;而且常见的我们将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) 应用于下游任务的常用方法。然而&#xff0c;直接微调大模型的所有参数通常需要大量的计算资源和内存。LoRA (Low-Rank Adaptation) 是一种高效的微调方法&#xff0c;它通过引入少量可训练参数&#xff0c;固定预训练模型…...

算法随笔_35: 每日温度

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

嵌入式硬件篇---CPUGPUTPU

文章目录 第一部分&#xff1a;处理器CPU&#xff08;中央处理器&#xff09;1.通用性2.核心数3.缓存4.指令集5.功耗和发热 GPU&#xff08;图形处理器&#xff09;1.并行处理2.核心数量3.内存带宽4.专门的应用 TPU&#xff08;张量处理单元&#xff09;1.为深度学习定制2.低精…...

STM32 PWM驱动舵机

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

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Module Federation 和 Native Federation 的比较

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

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...