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

[嵌入式 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 语言] 按位与、或、取反、异或

若协议中如下图所示&#xff1a; 注意&#xff1a; 长度为1&#xff0c;表示1个字节&#xff0c;也就是0xFF&#xff0c;也就是 1111 1111 &#xff08;这里0xFF只是单纯表示一个数&#xff0c;也可以是其他数&#xff0c;这里需要注意的是1个字节的意思&#xff09; 一、按位…...

Android --- 运行时Fragment如何获取Activity中的数据,又如何将数据传递到Activity中呢?

1.通过 getActivity() 方法获取 Activity 实例&#xff1a; 在 Fragment 中&#xff0c;可以通过 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&#xff0c;以下为代码的实现。 这里用LangGraph把L1的ReAct_Agent实现&#xff0c;可以看出用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 中&#xff0c;有多种函数可以用于应用 FIR/IIR 滤波器&#xff0c;每个函数的使用场景和特点各不相同。以下是一些常用的 FIR /IIR滤波器应用函数及其区别&#xff1a; from scipy.signal import lfiltery lfilter(fir_coeff, 1.0, x)from scipy.signal impo…...

简谈设计模式之建造者模式

建造者模式是一种创建型设计模式, 旨在将复杂对象的构建过程与其表示分离, 使同样的构建过程可以构建不同的表示. 建造者模式主要用于以下情况: 需要创建的对象非常复杂: 这个对象由多个部分组成, 且这些部分需要一步步地构建不同的表示: 通过相同的构建过程可以生成不同的表示…...

力扣 hot100 -- 动态规划(下)

目录 &#x1f4bb;最长递增子序列 AC 动态规划 AC 动态规划(贪心) 二分 &#x1f3e0;乘积最大子数组 AC 动规 AC 用 0 分割 &#x1f42c;分割等和子集 AC 二维DP AC 一维DP ⚾最长有效括号 AC 栈 哨兵 &#x1f4bb;最长递增子序列 300. 最长递增子序列…...

【计算机毕业设计】018基于weixin小程序实习记录

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

力扣之有序链表去重

删除链表中的重复元素&#xff0c;重复元素保留一个 p1 p2 1 -> 1 -> 2 -> 3 -> 3 -> null p1.val p2.val 那么删除 p2&#xff0c;注意 p1 此时保持不变 p1 p2 1 -> 2 -> 3 -> 3 -> null p1.val ! p2.val 那么 p1&#xff0c;p2 向后移动 p1 …...

Apache配置与应用(优化apache)

Apache配置解析&#xff08;配置优化&#xff09; Apache链接保持 KeepAlive&#xff1a;决定是否打开连接保持功能&#xff0c;后面接 OFF 表示关闭&#xff0c;接 ON 表示打开 KeepAliveTimeout&#xff1a;表示一次连接多次请求之间的最大间隔时间&#xff0c;即两次请求之间…...

怎么将3张照片合并成一张?这几种拼接方法很实用!

怎么将3张照片合并成一张&#xff1f;在我们丰富多彩的日常生活里&#xff0c;是否总爱捕捉那些稍纵即逝的美好瞬间&#xff0c;将它们定格为一张张珍贵的图片&#xff1f;然而&#xff0c;随着时间的推移&#xff0c;这些满载回忆的宝藏却可能逐渐演变成一项管理挑战&#xff…...

YOLOv10改进 | 图像去雾 | MB-TaylorFormer改善YOLOv10高分辨率和图像去雾检测(ICCV,全网独家首发)

一、本文介绍 本文给大家带来的改进机制是图像去雾MB-TaylorFormer&#xff0c;其发布于2023年的国际计算机视觉会议&#xff08;ICCV&#xff09;上&#xff0c;可以算是一遍比较权威的图像去雾网络&#xff0c; MB-TaylorFormer是一种为图像去雾设计的多分支高效Transformer…...

spring boot读取yml配置注意点记录

问题1&#xff1a;yml中配置的值加载到代码后值变了。 现场yml配置如下&#xff1a; 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 所表示的实体&#xff08;类、接口、基本类型或 void&#xff09;的超类的 Class。如果此 Class 表示 Object 类、一个接口、一个基本类型或 void&#xff0c;则返回 null。如果此对象表示一个数组类&#xff…...

ARM功耗管理标准接口之ACPI

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理有哪些标准接口&#xff1f;ACPI&PSCI&SCMI&#xff1f; Advanced Configuration and Power Interface Power State Coordination Interface System Control and Management Interface ACPI可以被理解为一…...

2024年网络监控软件排名|10大网络监控软件是哪些

网络安全&#xff0c;小到关系到企业的生死存亡&#xff0c;大到关系到国家的生死存亡。 因此网络安全刻不容缓&#xff0c;在这里推荐网络监控软件。 2024年这10款软件火爆监控市场。 1.安企神软件&#xff1a; 7天免费试用https://work.weixin.qq.com/ca/cawcde06a33907e6…...

通过Arcgis从逐月平均气温数据中提取并计算年平均气温

通过Arcgis快速将逐月平均气温数据生成年平均气温数据。本次用2020年逐月平均气温数据操作说明。 一、准备工作 &#xff08;1&#xff09;准备Arcmap桌面软件&#xff1b; &#xff08;2&#xff09;准备2020年逐月平均气温数据&#xff08;NC格式&#xff09;、范围图层数据&…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...