[嵌入式 C 语言] 按位与、或、取反、异或

news2024/9/25 17:18:46

一、按位与 &

  • 有0则0,全1则1
  • 1010 & 0011 =  0010
  • 0xef & 0xfe = 0xee ( 0x1110 1111 & 0x1111 1110 = 0x1110 1110)

若协议中如下图所示: 

1.1 配合左移运算符  <<  取指定的位

 说明:DEC表示十进制、BIN表示二进制、HEX表示十六进制

// (DEC)64 = (BIN)0011 0100 = (HEX)0x34

int 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");

    return 0;
}

输出: 绿灯灭 黄灯灭 红灯亮 蜂鸣器停 蓝灯亮 白灯亮

在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 0100

int main() {
    int targetState = 0x34; // 这个掩码代表了指定的状态:白灯蓝灯亮,蜂鸣器停,红灯亮,黄绿灯灭
    int data_1 = 0x64; // 数据,假设这就是我们得到的数据
    int data_2 = 0x34;

    // 使用按位与操作来检查data是否匹配targetState

    if((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;
}

输出:
原始状态: 绿灯灭 黄灯灭 红灯灭 蜂鸣器响 蓝灯灭 白灯亮
清零灯状态后: 绿灯灭 黄灯灭 红灯灭 蜂鸣器响 蓝灯灭 白灯灭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1909941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

原生APP开发的优势

原生APP开发是指使用特定的编程语言和开发工具&#xff0c;针对特定的操作系统平台进行开发的应用程序。相比于混合开发和Web开发&#xff0c;原生APP开发具有以下优势。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 性能更优 原…

echartsBug-dataZoom拖拽无效果

项目情况&#xff1a;"vue": "3.2.4",使用vue2语法开发 遇到问题&#xff1a;想要给图表增加dataZoom,但是拉拽的时候不生效 解决方法&#xff1a; 这个情况同样也会发生在tooltip不生效上。 之前的写法是将myChart定义在data()之中&#xff0c;但是无效…

怎么用js语句动态调整 .jstree.jstree-2.jstree-default 高度

&#x1f3c6;本文收录于《CSDN问答解惑》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

PHP全民投票微信小程序系统源码

&#x1f5f3;️【全民参与的力量】全民投票系统小程序&#xff0c;让决策更民主&#xff01; &#x1f310; 一键启动&#xff0c;全民参与 全民投票系统小程序&#xff0c;是连接每一个声音的高效桥梁。只需简单几步&#xff0c;即可在线发起投票活动&#xff0c;无论是社区…

java基础01—根据源码分析128陷阱以及如何避免128陷阱

源码分析128陷阱 如上图所示&#xff0c;int类型数据超过127依旧能正常比较&#xff0c;但Integer类型就无法正确比较了 /*** Cache to support the object identity semantics of autoboxing for values between* -128 and 127 (inclusive) as required by JLS.** The cache …

vue3在defineProps中使用多语言t,打包报错

报错原因 代码如下 打包后就会报错 defineProps() in script setup cannot reference locally declared variables because it will be hoisted outside of the setup() function. If your component options require initialization in the module scope, use a separate no…

LLm与微调

推荐尝试的微调模型 internlm2-20b-chat&#xff0c;internlm2-7b-chat&#xff0c; Qwen2-7B-Instruct, Qwen2-1.5B-Instruct, Qwen1.5-32B-Chat (Qwen2-0.5B、Qwen2-1.5B, qwen1.5的4B&#xff0c;7B&#xff0c;14B&#xff0c;32B) glm-4-9b-chat, glm-4-9b-chat-1m, gl…

设计资料:520-基于ZU15EG 适配AWR2243的雷达验证底板 高速信号处理板 AWR2243毫米波板

基于ZU15EG 适配AWR2243的雷达验证底板 一、板卡概述 本板卡系北京太速科技自主研发&#xff0c;基于MPSOC系列SOC XCZU15EG-FFVB1156架构&#xff0c;搭载两组64-bit DDR4&#xff0c;每组容量32Gb&#xff0c;最高可稳定运行在2400MT/s。另有1路10G SFP光纤接口、1路40G…

记录一次MySql锁等待 (Lock wait timeout exceeded)异常

[TOC](记录一次MySql锁等待 (Lock wait timeout exceeded)异常) Java执行一个SQL查询未提交&#xff0c;遇到1205错误。 java.lang.Exception: ### Error updating database. Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transactionCluster…

用Canvas绘制一个高可配置的圆形进度条

&#x1f680; 用Canvas绘制一个高可配置的圆形进度条 问题分析与拆解第一步&#xff0c;初始化一些默认参数&#xff0c;处理canvas模糊问题第二步&#xff0c;定义绘制函数1. 定义绘制主函数入口&#xff0c;该函数汇集了我们定义的其它绘制方法2. 定义绘制圆环函数3. 定义绘…

Linux-多线程

线程的概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行&#xff0c;本质是在进程地址空间内运行在Linux系统中&#xff0c;在CPU眼中…

IO之反序列化漏洞

hutool之XmlUtil反序列化漏洞 同样存在漏洞的方法还有IoUtil.readObject方法&#xff0c;存在反序列化漏洞&#xff0c;这些方法的漏洞在JDK中本身就存在&#xff0c;而且JDK的做法是要求用户自行检查内容&#xff0c;作为工具类&#xff0c;这块没法解决。hutool在新版本中把这…

800 元打造家庭版 SOC 安全运营中心

今天,我们开始一系列新的文章,将从独特而全面的角度探索网络安全世界,结合安全双方:红队和蓝队。 这种方法通常称为“紫队”,集成了进攻和防御技术,以提供对威胁和安全解决方案的全面了解。 在本系列的第一篇文章中,我们将指导您完成以 100 欧元约800元左右的预算创建…

电竞玩家的云端盛宴!四大云电脑平台:ToDesk、顺网云、青椒云、极云普惠云实测大比拼

本文目录 一、云电脑概念及市场需求二、云电竞性能测试2.1 ToDesk云电脑2.2 顺网云2.3 青椒云2.4 极云普惠云电脑 三、四大云电脑平台综合配置对比3.1 CPU处理器3.2 GPU显卡3.3 内存 四、总结 一、云电脑概念及市场需求 在数字化时代的推动下&#xff0c;云计算技术日益成熟&a…

【VUE基础】VUE3第九节—Pinia使用

Pinia使用 Pinia简介安装Pinia存储数据和读取数据State读取数据重置 state修改state值storeToRefs监听state Getter读取数据 Action Pinia简介 Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 安装Pinia yarn add pinia # 或者使用 npm npm inst…

24年,计算机仍然是最热门的专业?!

大家好&#xff0c;我是程序员鱼皮。最近很多高考完的朋友开始进入了填志愿选专业的时期。出于好奇&#xff0c;我也在网上了解了一下今年的热门专业和就业情况&#xff0c;结果并没有出乎我的意料&#xff0c;对于很多省份&#xff0c;计算机科学与技术依然是最热门的专业&…

视频汇聚平台EasyCVR设备录像回看请求播放时间和实际时间对不上,是何原因?

安防监控EasyCVR视频汇聚平台可提供多协议&#xff08;RTSP/RTMP/国标GB28181/GAT1400/海康Ehome/大华/海康/宇视等SDK&#xff09;的设备接入、音视频采集、视频转码、处理、分发等服务&#xff0c;系统具备实时监控、云端录像、回看、告警、平台级联以及多视频流格式分发等视…

spring的bean注册

bean注册 第三方jar包的类想添加到ioc中&#xff0c;加不了Component该怎么办呢。 可以使用Bean和Import引入jar包&#xff0c;可以使用maven安装到本地仓库。 修改bean的名字&#xff1a;Bean("aaa")使用ioc的已经存在的bean对象&#xff0c;如Country&#xff1a;p…

HTML实现图片查看与隐藏

你好呀&#xff0c;我是小邹。 在网页设计中&#xff0c;提供一个直观且用户友好的图片查看功能是提升用户体验的重要一环。本文将详细介绍如何使用HTML、CSS和JavaScript来实现图片的查看与隐藏功能。通过本教程&#xff0c;你将学会如何让页面上的图片在点击时放大显示&…

产线级MES系统在装配行业的具体应用

在装配行业中&#xff0c;产线级MES系统能够帮助企业优化生产流程&#xff0c;提高产品质量&#xff0c;增强生产效率。以下是产线级MES系统在装配行业中的一些具体应用场景。 了解慧都产线级MES系统>> 产线级MES系统应用场景 1. 生产过程监控与管理 MES系统可以实时…