【C语言】位运算
我们在上学计算机的第一节课,就应该见过这些常见的运算符。然而,你可能有印象,但记不住众多操作符当中的位运算符,以及它们的作用和使用场景,我们的大脑会选择性地遗忘它认为没用的信息,存储下那些“有实际应用场景”的有效知识。平时写代码的时候,只会和十进制打交道,这是因为在计算机的底层会帮我们把10进制运算的问题转化为二进制运算,计算机已经帮我们封装了位运算的逻辑。那么,我们为什么还要了解位运算呢?
在实际开发中,位图(Bitmap)是一种常用的数据结构和技术。通过高效的存储和操作方式,提供了快速且节省内存的解决方案。
例如,检测一批开发板是否合格,其中一个对象中存在某个属性:object:{ standard:true; } 这个对象中还有其他属性,但检测是否合格只需要判断 standard == 1;那么,假设用bit位来表示合格与不合格,1表示是,0表示非。
那么1个bit位 :10010000 第一个和第四个合格,其他的不合格,由此,我们不需要使用object的方式进行存储,我们可能将原本占用了32个字节大小的存储空间的对象压缩成了一个比特,8个比特可以检测8个开发板的合格与否。
一个字节是8个比特,所以存储空间被优化了256倍,假如有1000w块开发板需要检测并返回结果,用对象的方式存储需要占用的内存空间是300GB的内存空间大小,如果我们换成用bit的方式实现检测,只需要占用2GB的存储空间大小便能够完成检测。
使用这种一串比特位存储0和1两种状态的数据结构称为位图(BITMAP),
由此,我们知道了位图具有很多好处:
节省内存:位图能节省巨量的存储空间。内存效率高:使用位来表示信息,节省存储空间。例如,一个字节可以表示8个布尔值。对比数组 + 对象的方式不仅性能高出一个数量级而且极大节约了内存空间。快速访问:通过位运算可以快速地检查、设置或清除特定位的值。例如,查询第一个位置是否为 真:x & (1<<n);即使是某些批量操作和复杂操作,也只需要一次就能完成。便捷方便。资源管理、高效存储:用于管理有限资源的使用情况,如内存页的分配。状态标记:在控制多个布尔状态时(如任务调度),使用位图可以高效地管理和检查状态。图形显示:在简单图形系统中,用位图表示图像的像素状态。权限控制:利用位图表示用户或进程的权限集合。
移位运算符:专门写软件的人而言不重要,但对于嵌入式开发来说,这很重要 —> 因为在寄存器开发中会经常遇到。
<< >>
格式:表达式 << n
例子:移位运算--->针对位:bit位 --->二进制有关 int a=10;a<<3;
右移:要注意 符号位 算术右移: 空出来的位 补符号位 >考虑符号位逻辑右移: 空出来的位 补0 --->单纯的数值运算位运算: -->所有的运算都针对 二进制bit位 1>位与:& 解释: 表达式1 & 表达式2 ==>双方转化为二进制,按位对比,相同位上都为1,结果为1 例如: short a=520;short b=250;a&b--->a:0000 0010 0000 1000b:0000 0000 1111 1010 & ------------------------------>0000 0000 0000 1000 ==> 82>位或:|解释: 表达式1 | 表达式2 ==>相同位上数据如果有1,结果为1例如:short a=520;short b=250;a|b--->a:0000 0010 0000 1000b:0000 0000 1111 1010 |------------------------------------- 0000 0010 1111 1010 ==>7623>异或:^ 解释:表达式1 ^ 表达式2 ==>相同位上数据不相同,结果为1 例如:short a=520;short b=250;a^b--->a:0000 0010 0000 1000b:0000 0000 1111 1010 ^ -------------------------------0000 0010 1111 0010 ==> 754 4>取反:~ 解释: ~表达式1 ===> 0变1 1变0 例如: short a=520;a:0000 0010 0000 1000~a;1111 1101 1111 0111 --->有问题:补码1111 1101 1111 0110 --->反码 1000 0010 0000 1001 --->原码 = -521组合模仿:C语言原装是没有同或 :可以通过 取反 + 异或 得到同或 ~(a^b): --->达到同或
在嵌入式系统中,因为寄存器内存是有限的,对于内存空间的使用更为苛刻,位运算具有性能优势:
1、速度:位运算是基本的CPU操作,直接作用于数据的二进制表示,计算速度极快,比许多其他操作(如乘法、除法)更高效。
2、内存效率:通过位操作,可以在一个字节中存储多个布尔值,节省内存空间。
3、直接硬件控制:位运算能够直接操作硬件寄存器,方便设置或读取特定位,减少指令开销。
4、代码简洁、精确控制:使用位掩码进行状态管理和权限控制,使代码更简洁明了。提供对数据的精确控制,适合底层开发。
5、功耗降低:由于减少了处理器的运算时间和内存访问,能有效降低功耗,这是嵌入式系统中一个重要的考量。
位运算在资源有限、需要高效运行的嵌入式系统中有显著的性能优势,并节省了大量的内存空间。
位运算在控制硬件设备、检查传感器状态、高效传输和存储等多个场景中都十分必要,所以要熟悉位运算的方式。正如在编程之前,首先对每个过程中的逻辑环节都必须十分清晰,不可模糊编程。也可在这个过程中锤炼自己的编程思维,对业务流程也会更加清晰。
以上。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!
相关文章:
【C语言】位运算
我们在上学计算机的第一节课,就应该见过这些常见的运算符。然而,你可能有印象,但记不住众多操作符当中的位运算符,以及它们的作用和使用场景,我们的大脑会选择性地遗忘它认为没用的信息,存储下那些“有实际…...
计算机体系结构之多级缓存、缓存miss及缓存hit(二)
前面章节《计算机体系结构之缓存机制原理及其应用(一)》讲了关于缓存机制的原理及其应用,其中提出了多级缓存、缓存miss以及缓存hit的疑问。故,本章将进行展开讲解, 多级缓存、缓存miss以及缓存hit存在的意义是为了保持…...
【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据,LabVIEW 上位机绘制演化曲线
【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据,LabVIEW 上位机绘制演化曲线 主要介绍了 R78/G15 开发板基于 Arduino IDE 环境串口打印温湿度传感器 DHT11 和温度传感器 DS18B20 传感器的数据,并通过LabVIEW上位机绘制演…...
Oracle Fetch子句
FETCH 子句在 Oracle 中可以用来限制查询返回的行数 Oracle FETCH 子句语法 以下说明了行限制子句的语法: [ OFFSET offset ROWS]FETCH NEXT [ row_count | percent PERCENT ] ROWS [ ONLY | WITH TIES ]OFFSET 子句 OFFSET 子句指定在行限制开始之前要跳过行…...
Linux应用——线程池
1. 线程池要求 我们创建线程池的目的本质上是用空间换取时间,而我们选择于 C 的类内包装原生线程库的形式来创建,其具体实行逻辑如图 可以看到,整个线程池其实就是一个大型的 CP 模型,接下来我们来完成它 2. 整体模板 #pragma …...
95.【C语言】数据结构之双向链表的头插,头删,查找,中间插入,中间删除和销毁函数
目录 1.双向链表的头插 方法一 方法二 2.双向链表的头删 3.双向链表的销毁 4.双向链表的某个节点的数据查找 5.双向链表的中间插入 5.双向链表的中间删除 6.对比顺序表和链表 承接94.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删文章 1.双向链表的头插 方法…...
leetcode82:删除排序链表中的重复节点||
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1,2,3,3,4,4,5] 输出:[1,2,5]示例 2: 输入:head [1,1,1,2…...
【C#】使用.net9在C#中向现有对象动态添加属性
在 C# 中向现有对象动态添加属性并不像在 Python 或 JavaScript 中那样容易,因为 C# 是一种强类型语言。 但是,我们可以通过使用一些技术和库来实现这一点,例如扩展方法、字典等。本文将详细介绍如何在 C# 中实现这一点。ExpandoObject 方法 …...
Linux进程信号(信号的产生)
目录 什么是信号? 信号的产生 信号产生方式1:键盘 前台进程 后台进程 查看信号 signal系统调用 案例 理解进程记录信号 软件层面 硬件层面 信号产生方式2:指令 信号产生方式3:系统调用 kill系统调用 案例 其他产生信号的函数调用 1.rais…...
97_api_intro_imagerecognition_pdf2word
通用 PDF OCR 到 Word API 数据接口 文件处理,OCR,PDF 高可用图像识别引擎,基于机器学习,超精准识别率。 1. 产品功能 通用识别接口;支持中英文等多语言字符混合识别;formdata 格式 PDF 文件流传参…...
【算法】【优选算法】二分查找算法(上)
目录 一、二分查找简介1.1 朴素二分模板1.2 查找区间左端点模版1.3 查找区间右端点模版 二、leetcode 704.⼆分查找2.1 二分查找2.2 暴力枚举 三、Leetcode 34.在排序数组中查找元素的第⼀个和最后⼀个位置3.1 二分查找3.2 暴力枚举 四、35.搜索插⼊位置4.1 二分查找4.2 暴力枚…...
springboot初体验
目录 环境 controller 修改端口号 更改banner图标 运行结果 最核心的:自动装配 环境 jdk17springboot3.3.5maven3.8.2 controller controller层和启动类同级 package com.example.demo.controller; import org.springframework.web.bind.annotation.RequestMapping;…...
使用kalibr_calibration标定相机(realsense)和imu(h7min)
vslam-evaluation/VINS/Installation documentation/4.IMU和相机联合标定kalibr_calibration.md at master DroidAITech/vslam-evaluation GitHub 目录 1.kalibr安装 1.1安装依赖项 1.2创建工作空间 1.3下载kalibr并编译 1.4设置环境变量 2.准备标定板 3.配置驱动和打…...
绿色工厂认定流程
以下是认定绿色工厂的一般流程: 编制年度创建计划 各省辖市、省直管县(市)会结合本地区重点产业发展现状,挑选一批基础条件良好、有创建意愿和条件的企业进行储备培育,并依据当地工业企业发展实际情况按年度制定绿色工…...
《Python游戏编程入门》注-第5章5
《Python游戏编程入门》的“Analog Clock示例程序”部分讲解了模拟时钟的实现方法。该模拟时钟可以通过时针、分针和秒针的旋转,显示当前时间,如图1所示。 图1 模拟时钟 1 绘制圆 从图1中可以看出,时钟的边缘是一个白色的圆,可以通过如图2所示的代码进行绘制。 图2 绘制圆…...
LangChain Ollama实战文献检索助手(二)少样本提示FewShotPromptTemplate示例选择器
本期是用样例来提示大模型生成我们想要的答案。即在输入中给定提示的样例,以及提示模板,然后匹配较相关的样例进行文献综述。 创建示例样本FewShotPromptTemplate 这里我用GTP-o1生成了几个回答,作为样本 samples [{"theme": &…...
K倍区间 C++
1230. K倍区间 - AcWing题库 一开始想到的用前缀和来做,时间复杂度为O(n^2),Time Limit Exceeded #include <iostream> #include <cstring> #include <algorithm> #include <cstdio>using namespace std;const int N 100010;int n,k; in…...
Linux - 弯路系列3:安装和编译libvirt-4.5.0
系统:Anolis8(离线) 目录 1、步骤2、make过程中的错误错误1:error: xdr_u_int64_t undeclared (first use in this function) 3、make install的错误错误1:/usr/bin/mkdir -p ""/usr/local/etc/libvirt/nwf…...
Jenkins插件使用问题总结
Git Push插件 插件介绍 主要是用于git推送代码到远程仓库中使用,插件地址 pipeline中使用 官方说明中只有一句代码gitPush(gitScm: scm, targetBranch: env.BRANCH_NAME, targetRepo: origin) 流水线语法中也做的不齐全所以一开始我老是设置错,导致代…...
u盘怎么重装电脑系统_u盘重装电脑系统步骤和详细教程【新手宝典】
u盘怎么重装电脑系统?一个u盘怎么重装电脑系统呢,需要将u盘制作成u盘启动盘pe,然后通过U盘启动盘进入pe进行安装系统,下面小编就教大家u盘重装电脑系统步骤和详细教程。 u盘启动是什么意思? U盘启动盘是一种具有特殊功…...
Sql server查询数据库表的数量
SELECT count(*) FROM sys.objects WHERE typeU --统计表数量 SELECT NAME FROM sys.objects WHERE typeU --列出表名称 或者 SELECT COUNT(*) FROM SysObjects Where XTypeU --统计表数量 SELECT Name FROM SysObjects Where XTypeU --列出表名称 --判断字…...
Linux学习笔记之软件包管理RPM与YUM
RPM包的管理 介绍 RPM(RedHat Package Manager)用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。他生成具有.RPM扩展名的文件。RPM类似Windows的setup.exe,这一文件格式虽然打上了RedHat的标志,但理念…...
15分钟学 Go 第 41 天:中间件的使用
第41天:中间件的使用 目标:学习如何在Go语言的Web服务中使用中间件 中间件(Middleware)是Web开发中的一种常见设计模式,通常用于处理请求和响应过程中的一些共通功能。比如:日志记录、认证授权、请求处理…...
《Python 与 SQLite:强大的数据库组合》
《Python 与 SQLite:强大的数据库组合》 一、Python 与 SQLite 的结合二、安装与连接(一)安装 SQLite 模块(二)连接到数据库 三、数据库操作(一)创建表格(二)插入数据&am…...
Golang | Leetcode Golang题解之第552题学生出勤记录II
题目: 题解: const mod int 1e9 7type matrix [6][6]intfunc (a matrix) mul(b matrix) matrix {c : matrix{}for i, row : range a {for j : range b[0] {for k, v : range row {c[i][j] (c[i][j] v*b[k][j]) % mod}}}return c }func (a matrix) p…...
Vue3 常用代码指南手抄,超详细 cheatsheet
一、Vue3 基础 1.1 创建 Vue3 项目 使用 Vite 创建 npm create vitelatest my-vue-app -- --template vue cd my-vue-app npm install npm run dev使用 Vue CLI 创建 npm install -g vue/cli vue create my-vue-app1.2 项目结构 my-vue-app ├── node_modules ├── pu…...
结构体是否包含特定类型的成员变量
结构体是否包含特定类型的成员变量 在C中,可以使用模板元编程和类型特性(type traits)来判断一个结构体是否包含特定类型的成员变量。这通常通过std::is_member_object_pointer类型特性来实现,它可以用来检查给定的成员指针是否指…...
堆排序与链式二叉树:数据结构与排序算法的双重探索
大家好,我是小卡皮巴拉 文章目录 目录 引言 一.堆排序 1.1 版本一 核心概念 堆排序过程 1.2 版本二 堆排序函数 HeapSort 向下调整算法 AdjustDown 向上调整算法 AdjustUp 二.链式二叉树 2.1 前中后序遍历 链式二叉树的结构 创建链式二叉树 前序遍历…...
用 Python 从零开始创建神经网络(四):激活函数(Activation Functions)
激活函数(Activation Functions) 引言1. 激活函数的种类a. 阶跃激活功能b. 线性激活函数c. Sigmoid激活函数d. ReLU 激活函数e. more 2. 为什么使用激活函数3. 隐藏层的线性激活4. 一对神经元的 ReLU 激活5. 在隐蔽层中激活 ReLU6. ReLU 激活函数代码7. …...
使用 Flask 和 ONLYOFFICE 实现文档在线编辑功能
提示:CSDN 博主测评ONLYOFFICE 文章目录 引言技术栈环境准备安装 ONLYOFFICE 文档服务器获取 API 密钥安装 Flask 和 Requests 创建 Flask 应用项目结构编写 app.py创建模板 templates/index.html 运行应用功能详解文档上传生成编辑器 URL显示编辑器回调处理 安全性…...
上海网站建设明细报价表/游戏推广公司好做吗
题目链接:UVA - 11134 题意描述:在一个n*n(1<n<5000)的棋盘上放置n个车,每个车都只能在给定的一个矩形里放置,使其n个车两两不在同一行和同一列,判断并给出解决方案。 算法分析࿱…...
有哪个网站教人做美食/搜索网站的浏览器
1、这里我只讲核心,mysql查询语句:FIND_IN_SET(str,strlist) 2、具体教程可以参考【童攀老师的RBAC】,很清晰,赞一个。 3、详解:mysql的find_in_set 首先举个例子来说: 有个文章表里面有个type字段…...
长春网站建设sok/开网站需要投资多少钱
下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习。 在Objective-C中的集合类中主要包括不可变的数组--NSArr…...
java开发做网站/房地产估价师考试
最近有人问我在家里怎么远程操控办公室内网的电脑。这让我回想起了很多年前用灰鸽子啊,Radmin等软件。但其实利用QQ也可以很轻松地在家里控制办公室的电脑,只需要一些简单的设置。简单点说就是把QQ远程连接设置为自动接受请求。QQ自动接受远程桌面设置方…...
洛阳网站建设/扬州网络推广哪家好
asp.net操作Excel是B/S架构开发报表中经常遇到的,现对常见操作总结如下:DataGrid输出到Excel并进行格式化处理 用Xml2OleDb将XML文件插入到数据库在C#中利用Excel做高级报表在ASP.NET中将数据直接输出成Excel内容在.NET环境下将报表导出Excel和Word 将DataGrid输出到Excel文件把…...
网站可以做匿名聊天吗/备案域名购买
搭建好Flutter环境,打apk包时一直报400错误: Could not GET xxx, Received status code 400 from server: Bad Request 网上搜索了好些解决方案,最后看了这篇文章解决了,这里记录一下 https://blog.csdn.net/lqx_sunhan/articl…...