当前位置: 首页 > 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;、范围图层数据&…...

每日一题~abc356(对于一串连续数字 找规律,开数值桶算贡献)

添加链接描述 题意&#xff1a;对于给定的n,m 。计算0~n 每一个数和m & 之后&#xff0c;得到的数 的二进制中 1的个数的和。 一位一位的算。最多是60位。 我们只需要计算 在 1-n这些数上&#xff0c;有多少个数 第i位 为1. 因为是连续的自然数&#xff0c;每一位上1 的…...

商业合作方案撰写指南:让你的提案脱颖而出的秘诀

作为一名策划人&#xff0c;撰写一份商业合作方案需要细致的规划和清晰的表达。 它是一个综合性的过程&#xff0c;需要策划人具备市场洞察力、分析能力和创意思维。 以下是能够帮助你撰写一份有效的商业合作方案的关键步骤和要点&#xff1a; 明确合作目标&#xff1a;设定…...

【MySQL】锁(黑马课程)

【MySQL】锁 0. 锁的考察点1. 概述1. 锁的分类1.1 属性分类1.2 粒度分类 2. 全局锁2.1 全局锁操作2.2.1 备份问题 3. 表级锁3.1 表锁3.2 语法3.3 表共享读锁&#xff08;读锁&#xff09;3.4 表独占写锁&#xff08;写锁&#xff09;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天持有股票&#xff0c;dp[i][1]第i天不持有股票dp[0][0] -prices[0]for i in range(1, len(prices)):dp[…...

IEC62056标准体系简介-4.IEC62056-53 COSEM应用层

为在通信介质中传输COSEM对象模型&#xff0c;IEC62056参照OSI参考模型&#xff0c;制定了简化的三层通信模型&#xff0c;包括应用层、数据链路层&#xff08;或中间协议层&#xff09;和物理层&#xff0c;如图6所示。COSEM应用层完成对COSEM对象的属性和方法的访问&#xff…...

嵌入式应用开发之代码整洁之道

前言&#xff1a;本系列教程旨在如何将自己的代码写的整洁&#xff0c;同时也希望小伙伴们懂如何把代码写脏&#xff0c;以备不时之需&#xff0c;同时本系列参考 正点原子 &#xff0c; C代码整洁之道&#xff0c;编写可读的代码艺术。 #好的代码的特点 好的代码应该都有着几…...

iwconfig iwpriv学习之路

iwconfig和iwpriv是两个常用的wifi调试工具&#xff0c;最近需要使用这两个工具完成某款wifi芯片的定频测试&#xff0c;俗话说好记性不如烂笔头&#xff0c;于是再此记录下iwconfig和iwpriv的使用方式。 -----再牛逼的梦想&#xff0c;也抵不住傻逼般的坚持&#xff01; ----2…...

【Docker-compose】搭建php 环境

文章目录 Docker-compose容器编排1. 是什么2. 能干嘛3. 去哪下4. Compose 核心概念5. 实战 &#xff1a;linux 配置dns 服务器&#xff0c;搭建lemp环境&#xff08;Nginx MySQL (MariaDB) PHP &#xff09;要求6. 配置dns解析配置 lemp Docker-compose容器编排 1. 是什么 …...

【记录】LaTex|LaTex 代码片段 Listings 添加带圆圈数字标号的箭头(又名 LaTex Tikz 库画箭头的简要介绍)

文章目录 前言注意事项1 Tikz 的调用方法&#xff1a;newcommand2 标号圆圈数字的添加方式&#xff1a;\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭头写法&#xff1a;插入点相对位移标号node3.1 第一张图&#xff1a;插入点相对位移3.2 第二张图&#xff1…...

个人做短视频网站/深圳全网推广托管

yum服务器lvm扩容&#xff0c;data目录是yum存放rpm包的目录&#xff0c;只有20G&#xff0c;需要添加磁盘扩容到80G# df -lhFilesystem Size Used Avail Use% Mounted on/dev/mapper/vg_node5-root 20G 479M 18G 3% /tmpfs 935M…...

怎么登录已注册的网站/推销

IT行业高薪这似乎已经成为大家公认的事实了&#xff0c;于是&#xff0c;越来越多的人自以为是地看好了这块肥肉&#xff0c;并做好了对自己进行投资的万全准备&#xff0c;参加几万块钱的培训机构&#xff0c;一头扎入“放心&#xff0c;学四个月&#xff0c;我保证你月薪过万…...

南昌网站建设推广专家/企业seo顾问

最近开始学习php&#xff0c;安装了wamp集成环境&#xff0c;mysql可以使用phpMyAdmin打开&#xff0c;但是想要使用mysql 控制台却报错&#xff1a;MySQL服务无法启动&#xff08;2003 - Cant connect to MySQL server on‘localhost (10061). 在网上搜了很多方法经验包括&…...

合肥做网站建设公司/seo求职信息

介绍说明 在之前两章为了让大家从主流的概念入门&#xff0c;一直使用智能合约这个词来理解Fabric的链码&#xff0c;因为两者概念是一样的&#xff0c;只是由于智能合约这个在以太坊等其它区块链使用比较多&#xff0c;比较广泛&#xff0c;因此在这里也这么叫&#xff0c;好…...

杭州建设职业技术学院招聘信息网站/代运营是什么意思

JVM 中对象咋创建啊&#xff0c;又怎么访问啊 虚拟机遇到 new 指令&#xff0c;会根据指令参数去常量池找对应类的符号引用&#xff0c;如果没找到会进行类加载&#xff0c;此时会执行类构造器指令。类加载完成之后&#xff0c;初始化之前&#xff0c;开始进行对象内存分配&…...

实训做网站收获/正规接单赚佣金的平台

芯片设计进阶之路——门控时钟低功耗深入理解&#xff08;二&#xff09;------------------------------------------版权声明&#xff1a;本文作者&#xff1a; 烓围玮未。 主要从事ISP/MIPI/SOC/车规芯片设计首发于知乎专栏&#xff1a;芯片设计进阶之路微信公众号&#xff…...