[嵌入式 C 语言] 按位与、或、取反、异或
若协议中如下图所示:
注意:
长度为1,表示1个字节,也就是0xFF,也就是 1111 1111
(这里0xFF只是单纯表示一个数,也可以是其他数,这里需要注意的是1个字节的意思)
一、按位与 &
- 有0则0,全1则1
- 1010 & 0011 = 0010
- 0xef & 0xfe = 0xee ( 0x1110 1111 & 0x1111 1110 = 0x1110 1110)
1.1 配合左移运算符 << 取指定的位
说明:DEC表示十进制、BIN表示二进制、HEX表示十六进制
#include <stdio.h>
// (DEC)64 = (BIN)0011 0100 = (HEX)0x34int main()
{ int data = 0x34; // 定义位掩码int greenMask = 1 << 0; // 绿灯int yellowMask = 1 << 1; // 黄灯int redMask = 1 << 2; // 红灯int buzzerMask = 1 << 3; // 蜂鸣器int blueMask = 1 << 4; // 蓝灯int whiteMask = 1 << 5; // 白灯// 检查并打印状态if((data & greenMask) == 0) printf("绿灯灭 "); else printf("绿灯亮 ");if((data & yellowMask) == 0) printf("黄灯灭 "); else printf("黄灯亮 ");if((data & redMask) == 0) printf("红灯灭 "); else printf("红灯亮 ");if((data & buzzerMask) == 0) printf("蜂鸣器停 "); else printf("蜂鸣器响 ");if((data & blueMask) == 0) printf("蓝灯灭 "); else printf("蓝灯亮 ");if((data & whiteMask) == 0) printf("白灯灭\n"); else printf("白灯亮\n");printf("\n\n");printf("Green Mask Value: 0x%x\n", greenMask);printf("Yellow Mask Value: 0x%x\n", yellowMask);printf("White Mask Value: 0x%x\n", whiteMask);return 0;
}输出: 绿灯灭 黄灯灭 红灯亮 蜂鸣器停 蓝灯亮 白灯亮Green Mask Value: 0x1 // 0x1 = 0001Yellow Mask Value: 0x2 // 0x2 = 0010White Mask Value: 0x20 // 0x20 = 10 0000
在C语言中,`<<` 是位左移运算符。当你有一个整数值(在这个例子中是1)并对其使用左移运算符,意味着你将该数值的二进制表示向左移动指定位数。每向左移一位,数值就相当于乘以2(因为二进制系统下,每一位代表的权重是2的幂次)。
具体到你的代码示例:
- int greenMask = 1 << 0;表示将1(二进制表示为`00000001`)向左移动0位,实际上没有移动,所以`greenMask`的值为1,对应二进制的最低位,这里是用来控制绿灯的。
- int yellowMask = 1 << 1;将1向左移动1位,得到`00000010`,即十进制的2,用作黄灯的控制位。
- int redMask = 1 << 2;向左移2位,得到`00000100`,即十进制的4,对应红灯控制位。
- int buzzerMask = 1 << 3;移动3位,得到`00001000`,即十进制的8,用于蜂鸣器。
- int blueMask = 1 << 4;移动4位,得到`00010000`,即十进制的16,对应蓝灯。
- int whiteMask = 1 << 5;移动5位,得到`00100000`,即十进制的32,控制白灯。
这样,每个掩码变量都对应了一个特定的位,可以用来单独控制或检测某个功能的状态。在后续的条件判断中,通过按位与操作(`&`)检查`data`中的特定位是否为1,以此来确定对应设备的状态(开启或关闭)。
1.2 整体按位与
#include <stdio.h>// 0x64 = 0110 0100 0x34 = 0011 0100int main() {int targetState = 0x34; // 这个掩码代表了指定的状态:白灯蓝灯亮,蜂鸣器停,红灯亮,黄绿灯灭int data_1 = 0x64; // 数据,假设这就是我们得到的数据int data_2 = 0x34;// 使用按位与操作来检查data是否匹配targetStateif((data_1 & targetState) == targetState) {printf("状态匹配:白灯亮 蓝灯亮 蜂鸣器停 红灯亮 黄灯灭 绿灯灭\n");} else {printf("状态不匹配\n");}if((data_2 & targetState) == targetState) {printf("状态匹配:白灯亮 蓝灯亮 蜂鸣器停 红灯亮 黄灯灭 绿灯灭\n");} else {printf("状态不匹配\n");}return 0;
}输出:
状态不匹配
状态匹配:白灯亮 蓝灯亮 蜂鸣器停 红灯亮 黄灯灭 绿灯灭
1.3 清零状态
#include <stdio.h>int main() {// 定义位掩码int greenMask = 1 << 0; // 绿灯int yellowMask = 1 << 1; // 黄灯int redMask = 1 << 2; // 红灯int buzzerMask = 1 << 3; // 蜂鸣器int blueMask = 1 << 4; // 蓝灯int whiteMask = 1 << 5; // 白灯// 假设初始状态int data = 0b01101000; // 二进制表示,举例:绿灯灭、黄灯灭、红灯亮、蜂鸣器停、蓝灯亮、白灯亮// 打印原始状态printf("原始状态: ");if((data & greenMask) == 0) printf("绿灯灭 "); else printf("绿灯亮 ");if((data & yellowMask) == 0) printf("黄灯灭 "); else printf("黄灯亮 ");if((data & redMask) == 0) printf("红灯灭 "); else printf("红灯亮 ");if((data & buzzerMask) == 0) printf("蜂鸣器停 "); else printf("蜂鸣器响 ");if((data & blueMask) == 0) printf("蓝灯灭 "); else printf("蓝灯亮 ");if((data & whiteMask) == 0) printf("白灯灭\n"); else printf("白灯亮\n");// 创建清零所有灯的掩码int clearLightsMask = ~(greenMask | yellowMask | redMask | blueMask | whiteMask);// 使用按位与操作清零所有灯的状态data &= clearLightsMask;// 打印更新后的状态printf("清零灯状态后: ");if((data & greenMask) == 0) printf("绿灯灭 "); else printf("绿灯亮 ");if((data & yellowMask) == 0) printf("黄灯灭 "); else printf("黄灯亮 ");if((data & redMask) == 0) printf("红灯灭 "); else printf("红灯亮 ");if((data & buzzerMask) == 0) printf("蜂鸣器停 "); else printf("蜂鸣器响 ");if((data & blueMask) == 0) printf("蓝灯灭 "); else printf("蓝灯亮 ");if((data & whiteMask) == 0) printf("白灯灭\n"); else printf("白灯亮\n");return 0;
}输出:
原始状态: 绿灯灭 黄灯灭 红灯灭 蜂鸣器响 蓝灯灭 白灯亮
清零灯状态后: 绿灯灭 黄灯灭 红灯灭 蜂鸣器响 蓝灯灭 白灯灭
综合
示例 1 :
要求: 取一个数的高八位与低八位,并将二者的顺序替换
涉及操作:
- 取一个数中的某些值
- 将两个8位的数合并为一个16位的数
#include <stdio.h>
#include <stdint.h>int main() {uint16_t combinedData = 0b0110011110110100; // (BIN) 0110011110110100 = (HEX) 0x67B4uint8_t highByte = combinedData >> 8; // 取左边的八位uint8_t lowByte = combinedData & 0xFF; // 取右边的八位printf("Combined data in hexadecimal: 0x%x\n", combinedData);printf("highByte data in hexadecimal: 0x%x\n", highByte);printf("lowByte data in hexadecimal: 0x%x\n", lowByte);// 调换高八位与低八位顺序combinedData = (lowByte << 8) | highByte; // 右边的八位左移后变成16位,再与原本的左边八位取或printf("Combined data in hexadecimal: 0x%x\n", combinedData);return 0;
}输出:Combined data in hexadecimal: 0x67b4highByte data in hexadecimal: 0x67lowByte data in hexadecimal: 0xb4Combined data in hexadecimal: 0xb467比如是在串口接收的时候:if(upAck->funcCode==0x03) // 表示要读寄存器时{// upAck->regAmt 为寄存器的数量,若一个寄存器为16位for(u16 i = 0; i < upAck->regAmt; i+=2) // 每两个字节一组进行高低字节交换{u16 lowByte = MeterAck->data[i]; // 保存低字节u16 highByte = MeterAck->data[i+1]; // 保存高字节// 组合成正确的16位值,此时lowByte已经是低字节,highByte是高字节u16 temp = (highByte << 8) | lowByte; // 分别提取高字节和低字节到响应缓冲区upAck->rdata[i] = highByte; // 高字节upAck->rdata[i+1] = lowByte; // 低字节}}
示例 2 :
要求: 检测所有器件是否全部停止
涉及操作:
- 位与操作
#include <stdio.h>int main()
{ int data_0 = 0x34; // (DEC)64 = (BIN)0011 0100 = (HEX)0x34int data_1 = 0x00;if (data_0 & 0x3F) // 0x3F = 0011 1111printf("存在器件在运行\n");else printf("所有已经停止\n");if (data_1 & 0x3F) // 0x3F = 0011 1111printf("存在器件在运行\n");else printf("所有已经停止\n");return 0;
}输出:存在器件在运行所有已经停止
相关文章:
[嵌入式 C 语言] 按位与、或、取反、异或
若协议中如下图所示: 注意: 长度为1,表示1个字节,也就是0xFF,也就是 1111 1111 (这里0xFF只是单纯表示一个数,也可以是其他数,这里需要注意的是1个字节的意思) 一、按位…...
Android --- 运行时Fragment如何获取Activity中的数据,又如何将数据传递到Activity中呢?
1.通过 getActivity() 方法获取 Activity 实例: 在 Fragment 中,可以通过 getActivity() 方法获取当前 Fragment 所依附的 Activity 实例。然后可以调用 Activity 的公共方法或者直接访问 Activity 的字段来获取数据。 // 在 Fragment 中获取 Activity…...
Java后端开发(十三)-- Java8 stream的 orElse(null) 和 orElseGet(null)
orElse(null)表示如果一个都没找到返回null。【orElse()中可以塞默认值。如果找不到就会返回orElse中你自己设置的默认值。】 orElseGet(null)表示如果一个都没找到返回null。【orElseGet()中可以塞默认值。如果找不到就会返回orElseGet中你自己设置的默认值。】 区别就…...
L2 LangGraph_Components
参考自https://www.deeplearning.ai/short-courses/ai-agents-in-langgraph,以下为代码的实现。 这里用LangGraph把L1的ReAct_Agent实现,可以看出用LangGraph流程化了很多。 LangGraph Components import os from dotenv import load_dotenv, find_do…...
09.C2W4.Word Embeddings with Neural Networks
往期文章请点这里 目录 OverviewBasic Word RepresentationsIntegersOne-hot vectors Word EmbeddingsMeaning as vectorsWord embedding vectors Word embedding processWord Embedding MethodsBasic word embedding methodsAdvanced word embedding methods Continuous Bag-…...
硅谷甄选二(登录)
一、登录路由静态组件 src\views\login\index.vue <template><div class"login_container"><!-- Layout 布局 --><el-row><el-col :span"12" :xs"0"></el-col><el-col :span"12" :xs"2…...
scipy库中,不同应用滤波函数的区别,以及FIR滤波器和IIR滤波器的区别
一、在 Python 中,有多种函数可以用于应用 FIR/IIR 滤波器,每个函数的使用场景和特点各不相同。以下是一些常用的 FIR /IIR滤波器应用函数及其区别: from scipy.signal import lfiltery lfilter(fir_coeff, 1.0, x)from scipy.signal impo…...
简谈设计模式之建造者模式
建造者模式是一种创建型设计模式, 旨在将复杂对象的构建过程与其表示分离, 使同样的构建过程可以构建不同的表示. 建造者模式主要用于以下情况: 需要创建的对象非常复杂: 这个对象由多个部分组成, 且这些部分需要一步步地构建不同的表示: 通过相同的构建过程可以生成不同的表示…...
力扣 hot100 -- 动态规划(下)
目录 💻最长递增子序列 AC 动态规划 AC 动态规划(贪心) 二分 🏠乘积最大子数组 AC 动规 AC 用 0 分割 🐬分割等和子集 AC 二维DP AC 一维DP ⚾最长有效括号 AC 栈 哨兵 💻最长递增子序列 300. 最长递增子序列…...
【计算机毕业设计】018基于weixin小程序实习记录
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...
力扣之有序链表去重
删除链表中的重复元素,重复元素保留一个 p1 p2 1 -> 1 -> 2 -> 3 -> 3 -> null p1.val p2.val 那么删除 p2,注意 p1 此时保持不变 p1 p2 1 -> 2 -> 3 -> 3 -> null p1.val ! p2.val 那么 p1,p2 向后移动 p1 …...
Apache配置与应用(优化apache)
Apache配置解析(配置优化) Apache链接保持 KeepAlive:决定是否打开连接保持功能,后面接 OFF 表示关闭,接 ON 表示打开 KeepAliveTimeout:表示一次连接多次请求之间的最大间隔时间,即两次请求之间…...
怎么将3张照片合并成一张?这几种拼接方法很实用!
怎么将3张照片合并成一张?在我们丰富多彩的日常生活里,是否总爱捕捉那些稍纵即逝的美好瞬间,将它们定格为一张张珍贵的图片?然而,随着时间的推移,这些满载回忆的宝藏却可能逐渐演变成一项管理挑战ÿ…...
YOLOv10改进 | 图像去雾 | MB-TaylorFormer改善YOLOv10高分辨率和图像去雾检测(ICCV,全网独家首发)
一、本文介绍 本文给大家带来的改进机制是图像去雾MB-TaylorFormer,其发布于2023年的国际计算机视觉会议(ICCV)上,可以算是一遍比较权威的图像去雾网络, MB-TaylorFormer是一种为图像去雾设计的多分支高效Transformer…...
spring boot读取yml配置注意点记录
问题1:yml中配置的值加载到代码后值变了。 现场yml配置如下: type-maps:infos:data_register: 0ns_xzdy: 010000ns_zldy: 020000ns_yl: 030000ns_jzjz: 040000ns_ggglyggfwjz: 050000ns_syffyjz: 060000ns_gyjz: 070000ns_ccywljz: 080000ns_qtjz: 090…...
电子电气架构 --- 关于DoIP的一些闲思 下
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
Java getSuperclass和getGenericSuperclass
1.官方API对这两个方法的介绍 getSuperclass : 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。如果此 Class 表示 Object 类、一个接口、一个基本类型或 void,则返回 null。如果此对象表示一个数组类ÿ…...
ARM功耗管理标准接口之ACPI
安全之安全(security)博客目录导读 思考:功耗管理有哪些标准接口?ACPI&PSCI&SCMI? Advanced Configuration and Power Interface Power State Coordination Interface System Control and Management Interface ACPI可以被理解为一…...
2024年网络监控软件排名|10大网络监控软件是哪些
网络安全,小到关系到企业的生死存亡,大到关系到国家的生死存亡。 因此网络安全刻不容缓,在这里推荐网络监控软件。 2024年这10款软件火爆监控市场。 1.安企神软件: 7天免费试用https://work.weixin.qq.com/ca/cawcde06a33907e6…...
通过Arcgis从逐月平均气温数据中提取并计算年平均气温
通过Arcgis快速将逐月平均气温数据生成年平均气温数据。本次用2020年逐月平均气温数据操作说明。 一、准备工作 (1)准备Arcmap桌面软件; (2)准备2020年逐月平均气温数据(NC格式)、范围图层数据&…...
每日一题~abc356(对于一串连续数字 找规律,开数值桶算贡献)
添加链接描述 题意:对于给定的n,m 。计算0~n 每一个数和m & 之后,得到的数 的二进制中 1的个数的和。 一位一位的算。最多是60位。 我们只需要计算 在 1-n这些数上,有多少个数 第i位 为1. 因为是连续的自然数,每一位上1 的…...
商业合作方案撰写指南:让你的提案脱颖而出的秘诀
作为一名策划人,撰写一份商业合作方案需要细致的规划和清晰的表达。 它是一个综合性的过程,需要策划人具备市场洞察力、分析能力和创意思维。 以下是能够帮助你撰写一份有效的商业合作方案的关键步骤和要点: 明确合作目标:设定…...
【MySQL】锁(黑马课程)
【MySQL】锁 0. 锁的考察点1. 概述1. 锁的分类1.1 属性分类1.2 粒度分类 2. 全局锁2.1 全局锁操作2.2.1 备份问题 3. 表级锁3.1 表锁3.2 语法3.3 表共享读锁(读锁)3.4 表独占写锁(写锁)3.5 元数据锁(meta data lock, MDL)3.6 意向…...
1.10编程基础之简单排序--02:奇数单增序列
OpenJudge - 02:奇数单增序列http://noi.openjudge.cn/ch0110/02/ 描述 给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。 输入 共2行: 第1行为 N; 第2行为 N 个正整数,其间用空格间隔。 输出 增序输出的奇数序列,数据之间以逗号间隔。数…...
【leetcode78-81贪心算法、技巧96-100】
贪心算法【78-81】 121.买卖股票的最佳时机 class Solution:def maxProfit(self, prices: List[int]) -> int:dp[[0,0] for _ in range(len(prices))] #dp[i][0]第i天持有股票,dp[i][1]第i天不持有股票dp[0][0] -prices[0]for i in range(1, len(prices)):dp[…...
IEC62056标准体系简介-4.IEC62056-53 COSEM应用层
为在通信介质中传输COSEM对象模型,IEC62056参照OSI参考模型,制定了简化的三层通信模型,包括应用层、数据链路层(或中间协议层)和物理层,如图6所示。COSEM应用层完成对COSEM对象的属性和方法的访问ÿ…...
嵌入式应用开发之代码整洁之道
前言:本系列教程旨在如何将自己的代码写的整洁,同时也希望小伙伴们懂如何把代码写脏,以备不时之需,同时本系列参考 正点原子 , C代码整洁之道,编写可读的代码艺术。 #好的代码的特点 好的代码应该都有着几…...
iwconfig iwpriv学习之路
iwconfig和iwpriv是两个常用的wifi调试工具,最近需要使用这两个工具完成某款wifi芯片的定频测试,俗话说好记性不如烂笔头,于是再此记录下iwconfig和iwpriv的使用方式。 -----再牛逼的梦想,也抵不住傻逼般的坚持! ----2…...
【Docker-compose】搭建php 环境
文章目录 Docker-compose容器编排1. 是什么2. 能干嘛3. 去哪下4. Compose 核心概念5. 实战 :linux 配置dns 服务器,搭建lemp环境(Nginx MySQL (MariaDB) PHP )要求6. 配置dns解析配置 lemp Docker-compose容器编排 1. 是什么 …...
【记录】LaTex|LaTex 代码片段 Listings 添加带圆圈数字标号的箭头(又名 LaTex Tikz 库画箭头的简要介绍)
文章目录 前言注意事项1 Tikz 的调用方法:newcommand2 标号圆圈数字的添加方式:\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭头写法:插入点相对位移标号node3.1 第一张图:插入点相对位移3.2 第二张图࿱…...
个人做短视频网站/深圳全网推广托管
yum服务器lvm扩容,data目录是yum存放rpm包的目录,只有20G,需要添加磁盘扩容到80G# df -lhFilesystem Size Used Avail Use% Mounted on/dev/mapper/vg_node5-root 20G 479M 18G 3% /tmpfs 935M…...
怎么登录已注册的网站/推销
IT行业高薪这似乎已经成为大家公认的事实了,于是,越来越多的人自以为是地看好了这块肥肉,并做好了对自己进行投资的万全准备,参加几万块钱的培训机构,一头扎入“放心,学四个月,我保证你月薪过万…...
南昌网站建设推广专家/企业seo顾问
最近开始学习php,安装了wamp集成环境,mysql可以使用phpMyAdmin打开,但是想要使用mysql 控制台却报错:MySQL服务无法启动(2003 - Cant connect to MySQL server on‘localhost (10061). 在网上搜了很多方法经验包括&…...
合肥做网站建设公司/seo求职信息
介绍说明 在之前两章为了让大家从主流的概念入门,一直使用智能合约这个词来理解Fabric的链码,因为两者概念是一样的,只是由于智能合约这个在以太坊等其它区块链使用比较多,比较广泛,因此在这里也这么叫,好…...
杭州建设职业技术学院招聘信息网站/代运营是什么意思
JVM 中对象咋创建啊,又怎么访问啊 虚拟机遇到 new 指令,会根据指令参数去常量池找对应类的符号引用,如果没找到会进行类加载,此时会执行类构造器指令。类加载完成之后,初始化之前,开始进行对象内存分配&…...
实训做网站收获/正规接单赚佣金的平台
芯片设计进阶之路——门控时钟低功耗深入理解(二)------------------------------------------版权声明:本文作者: 烓围玮未。 主要从事ISP/MIPI/SOC/车规芯片设计首发于知乎专栏:芯片设计进阶之路微信公众号ÿ…...