寄存器某一位置位或者清零

C语言的位操作 - bit 、byte的清零,置1,提取,判断 首先,以下是按位运算符:在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值,这时就可以使用按位运算符进行操作。下面进行举例说明,假如有一个8位的TEST寄存器:bit1~bit7,如果这高7位没有用到的话,这么设置没有什么影响;但是,如果这7位正在被使用,结果就不是我们想要的了。在这种情况下,我们就可以借用按位操作运算符进行配置。 阅读详情


Linux系统宏定义: #define  BIT_MASK(nr)      ( 1UL <<  ( (nr) % BITS_PER_LONG) )


应用一:将寄存器中的某一位置1或则清0,保持其他位不变。




int l_data;
void SetBit(int pos)//将某一位置位的操作
{
	if((pos >= 0) && (pos <= 31))
	{
		l_data |= BIT_MASK(pos);//BIT_MASK是 掩码。就是除了这一位其余位均为0

	}
}
void ClrBit(int pos)//将某一位清0的操作
{
	if((pos >= 0) && (pos <= 31))
	{
		l_data &= ~BIT_MASK(pos);
	}
}








说明:

该操作的依据如下:

1.0|1 == 1,1|1 == 1,故无论0还是1同1执行|操作,结果为1;无论0还是1同0执行|操作,都将保持不变。

2.1&0 == 0,0&0 == 0,故无论0还是1同0执行&操作,结果为0;无论0还是1同1执行&操作,都将保持不变。

应用二、判断寄存器某一位为0还是1




bool is1(int pos)//判断某一位是否为1
{
	if((pos >= 0) && (pos <= 31))
	{
		if(l_data & (BIT_MASK(pos)) == 0x1)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}









应用三、将寄存器的某一位取反(1->0;0->1)




void ReverseBit(int pos)//将某一位取反
{
	if((pos >= 0) && (pos <= 31))
	{
		l_data ^= BIT_MASK(pos);
	}
}







说明:与0异或,保持不变;与1异或,取反。

应用四、保留2个数的不同部分,将它们合并为1个数


方法一:这两个数除了有效位之外,其他位均为0,可以将其先适当移位操作,然后在"|"运算。


例一:将temp中的低8位和t中的高4位组合成一个12位数




unsigned short temp = 0x00AB;
unsigned char t = 0xC0;
temp = temp<<4;
temp |= (t>>4);









例二:保留channel的底4位,将其作为result的高4位,result的低4位设置为0xC;

channel = (channel<<4) | 0x0C;




方法二:如果这2个数除了有效位之外,其他位需要保留为1,方法是先与适当的数"|",之后2个数"&"


例一:保留temp的高4位和line的底4位,并将其组合成result。由于line的其他位全位1,所以必须先将temp的其他位全部设置为1,之后2个数"&"即可。




unsigned char result;
unsigned char temp = 0xAB;
unsigned char line = 0xFE;
temp |= 0x0F;
result = temp&line;









应用五、将一个16位数的高低8位分别拆成2个8位数,方法是通过多字节数赋给少字节数,多字节数高位字节部分将被自动截取的原理。




unsigned short temp = 0xCDAB;
unsigned char fir;
unsigned char sec;
fir = temp>>8;
sec = temp;









应用六、如果CPU没有来算数移位操作,如何用逻辑移位操作实现。

例如:line = 0xFE,如何实现其的左移操作后,右边补入的是1而不是默认的0。

line = (line<<1)|0x01;









http://blog.sina.com.cn/s/blog_8795b0970101j5ij.html



STM32 寄存器位操作详解 在对STM32寄存器操作时,我们经常会对寄存器的某一位或几位进行修改并且保持其他位不变,这时候就会用到C语言的位操作方法。那么如何进行位操作,以及位操作的原理是什么呢?话不多说直接开冲: 1、把变量的某位清零 //先定义一个随机变量a unsigned char a = 0x9f; //对bit2位进行清零操作 a &= ~(1 << 2); 首先,随便给一个变量,为了跟32的代码接近点,我们也用16进制,然后0x9f就是1001 1111 b(二进制) 要求对bit2位清零,也就是说 阅读详情

相关推荐

【单周期CPU】LoongArch | 32位寄存器DR | 32位的程序计数器PC | 通用寄存器堆Registers | 32位RAM存储器

【单周期CPU】LoongArch | 32位寄存器DR | 32位的程序计数器PC | 通用寄存器堆Registers | 32位RAM存储器

m0_66307842的博客 6685

嵌入式 寄存器某一位置位或清零

应用一:将寄存器中的某一位置1或则清0,保持其他位不变。 int l_data; void SetBit(int pos)//将某一位置位的操作 { if((pos >= 0) && (pos <= 31)) { l_data |= BIT_MASK(pos);//BIT_MASK是 掩码。就是除了这一位其余位均为0 } } void ClrBit(int pos)//将某一位清0的操作 { i

skdkjxy的专栏 5265

X86架构寄存器介绍

x86 寄存器系统通过分工协作实现高效计算与控制:通用寄存器处理数据操作,段寄存器管理内存分区,EFLAGS 跟踪状态,控制寄存器管理 CPU 模式。理解其设计对操作系统开发、逆向工程和性能优化至关重要。在 64 位模式下,寄存器扩展和新增的 R8-R15 进一步提升了复杂应用的效率。

sinat_56559405的博客 2509

8位寄存器置位与清零操作

对寄存器A的第四位进行置位操作,1<<4, A=A|(1<<4). 对寄存器A的第四位进行清零操作,1<<4,A=A&~(1<<4)。 置位与清零寄存器某一位操作,不影响其他位。

d3wap的博客 3121

C语言 | 嵌入式位操作精华技巧汇总

分享关于位操作一些笔记: 一、位操作简单介绍 首先,以下是按位运算符: 在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值,这时就可以使用按位运算符进行操作。下面进行举例说明,假如有一个8位的TEST寄存器: 当我们要设置第0位bit0的值为1时,可能会这样进行设置: TEST = 0x01; 但是,这样设置是不够准确的,...

嵌入式大杂烩 2780

DVWA靶场实战:手把手教你绕过文件上传限制,用蚁剑连接一句话木马

本文详细介绍了在DVWA靶场中如何绕过文件上传限制并利用蚁剑连接一句话木马的实战技巧。通过分析文件上传漏洞原理、创建一句话木马、使用Burp Suite拦截修改请求以及配置蚁剑连接WebShell的全过程,帮助安全研究人员深入理解Web安全防护与攻击技术。

weixin_30335575的博客 90

【汇编ASM】寄存器指定位置清零

【汇编ASM】寄存器指定位置清零

_TFBoy的小茶馆 4579

Microsoft Defender防病毒扫描添加排除项

Win10与Win11上的“**Microsoft Defender防病毒**”功能默认会自动扫描所有非压缩文件,如果发现病毒或疑似病毒甚至经过手动修改后某些安装文件,会自动将其删除,如果是后面两种情况,则可能会造成误报,对我们正常办公或学习造成不利影响。 此时, 我们可以将某个目录或文件设置为“**Microsoft Defender防病毒不会扫描已排除的项目**”(<red>但要注意:这些被排除的目录或文件会给笔记本造成一定的安全风险,如果真有病毒感染这些目录或文件它们也不会被“**Micr

weixin_42148668的博客 6480

C语言位操作 - bit 、byte的清零,置1,提取,判断

一、位操作概述 针对MCU的嵌入是开发中经常涉及到寄存器的操作,例如GPIO配置低寄存器GPIOx_CRL(共32个bit),有时需要改变其中的一位或者几位bit值,同时不能影响其它bit位的值。 例如,需要设置第0位bit=1时,不能简单的设置为:GPIOx_CRL=0x01 ,这样的方法会使得低配置寄存器GPIOx_CRL的其它比特位都置为0。 对于二进制位操作来说: 不管该...

pl0020的博客 5万+

Oracle登录报错ORA-12560?5分钟搞定TNS协议适配器错误的完整修复指南

本文详细解析了Oracle登录报错ORA-12560(TNS协议适配器错误)的成因与解决方案。从基础服务检查到高级网络配置排查,提供了一套完整的修复流程,帮助数据库管理员快速解决连接问题,确保Oracle数据库的稳定运行。

weixin_29278805的博客 519

Benchmark系列——基本概念和分类

本文主要介绍了Benchmark的基本概念和分类情况。

Bluetangos的博客 8432

matlab 位清零,单片机如何清零寄存器某一位,操作方法解析

描述单片机如何清零寄存器置位就是把该位置1,清零就是把该位置0硬件自动清零就是当某种条件成立,硬件会自动把该位清零。比如定时计数器工作时,当定时时间到了,定时中断请求标志位硬件自动置位,当cpu响应了中断以后就会自动把该位清零。所谓的软件清零,就是要在程序中,通过指令把该位清零。写1清零应该是某些单片机特有的,比如AVR单片机,要把某个寄存器清零,先写1-既是输入高电平,这样可以使内部的一个三极管...

weixin_34223525的博客 2453

configure: error: no acceptable C compiler found in $PATH解决方案

本文主要介绍了configure: error: no acceptable C compiler found in $PATH解决方案,希望能对使用Linux的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 4万+

将寄存器清零的指令c语言,将 CX 寄存器低 4 位清零的正确指令是() 。

相关题目与解析将CX寄存器低四位清零其它位不变的正确指令是()A.ANDCX,OFOHB.ANDCX,OFFFOHC.ANDCX,1110HD.若要使寄存器AL中的高4位不变,低4位为0,所用指令为()。A.ANDAL,0FHB.ANDAL,F0HC.ORAL,0FHD将R1寄存器中的指定位bit0和bit3清零,以下ARM汇编指令正确的是()。A.ANDR1,R1,0xFFFFFFF6B.BIC...

weixin_42146230的博客 6698

龙虾机器人(OpenClaw)本地部署完全技术指南

在开始部署之前,我们需要明确部署的对象。通常所说的“龙虾机器人”指的是开源项目 OpenClaw(曾用名:Clawdbot、Moltbot)。它由程序员彼得·斯坦伯格开发,是一个开源的、可本地部署的通用型AI代理系统。与ChatGPT等对话式AI不同,OpenClaw被赋予了操作系统的权限:它可以执行终端命令、读写文件、操控浏览器、安装软件,甚至通过MCP协议调用外部工具。

huanghm88的专栏 2万+

程序化广告ADX系统架构设计与实现

摘要: 本文详细介绍了程序化广告交易平台(ADX)的系统架构设计与实现。ADX作为连接广告主与媒体的核心平台,采用基于腾讯云和阿里云的微服务架构,包含网络基础设施、负载均衡、消息处理、核心业务服务和多级数据存储等层次。重点解析了Kafka消息队列处理高并发广告请求、Redis实时统计关键指标等核心技术实现,并提供了Java代码示例展示广告请求处理、竞价流程等核心功能。该系统通过分层设计和分布式组件,实现了高性能、高可用的程序化广告交易能力。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 764

寄存器清零和置一操作

注:如果不将与运算的结果右移7位也是可以的,这样b要么等于0b1000 0000,要么等于0,直接放到if或while等条件判断中也是可以的,条件表达式中只要是不等于0都认为是条件成立。让a&0b1000 0000,如果第7位是1则得到0b1000 0000,再将其右移7位得到0b1,保存到b中。假定a = 0xA0;在逻辑运算中1|1=1,1|0=0,0|0=0 其中|是或运算的符号。首先,在逻辑运算中,1&1=1,1&0=0,0&0=0。如果第7位是0,则得到0,右移7位后还是0,保存到b中。

m0_66297340的博客 1418

ASPICE标准快速掌握「总目录」

欢迎大家来到雪云飞星的《ASPICE标准快速掌握》,开始前博主先列出本专栏学习的大纲,同时这也可以作为大家学习ASPICE协议知识点的参考。本专栏可以帮助大家快速掌握如何在项目中使用ASPICE,ASPICE的学习通常仅需要半天时间左右,掌握方法后完全就可以结合快查表来指导具体项目的质量提升了。

雪云飞星的博客 3008

STM32F103学习笔记(2.1)——寄存器清零和置一操作

寄存器常见的清零和置一操作,使用到的是&=和|=,以及二进制的左移()

qq_42697289的博客 4336

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

位运算专题——如何对某一位置0或者置1?

参考 博文01:https://blog.youkuaiyun.com/hongjiujing/article/details/2178593 一、前言 学习本节课之前要先去学习位运算操作符的理论知识,注意运算符之间的优先级。 二、 如何对某一位置0或者置1? 方法一: 写成宏,方便移植 #define setbit(x,y) x|=(1<<y) //将X的第Y位置1 #define clrbit...

博雅勇士的博客 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

对不能直接进行位操作的寄存器的内容进行某位置一、清零和取反操作。

在学习ARM嵌入式开发时,时常会进行对寄存器中某个位的操作,但又不能像51单片机开发时能进行直接的位操作。为此自己写了一段程序以便之后能用到时能取个方便。同时分享出来,希望能帮到和我一样的正在学习中的萌新。//此头文件内容为这三个函数的声明,在此不列出。 #include"bit_operate.h" //得到需要进行操作的位的内容,方便之后判断 #define GET_BIT(x ,n) (x ...

jixianglsq的博客 3629

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

位操作---置位(置1)、清除和取反

我们在对寄存器进行编程时,通常需要对寄存器中的某一位进行置位或清除操作,但是同时我们又不能影响其它位。 所以接下来讲解具体如何对相应位进行置位或清除操作。 1、置位 1.1含义 就是将数据的某些位设为1。 1.2做法 采用 “或”运算 和 移位。 这种做法的特点就是:在对目标位进行置位时,不影响(改变)其它位. 如何不改变其它位呢? 就是其它位进行“或”运算的对象都是0. 例: 1.将a的第...

chengwei1128的博客 2万+

寄存器位_置0或置1操作

寄存器位_置0或置1操作

weixin_41226265的博客 1818

寄存器操作的方法

 一, 寄存器的设置和操作特性1,一个寄存器的每个位有其不同的意义,进行不同的设置会使硬件产生不同的效果和功能;2,有些情况下需要对一个寄存器进行连续的不同的甚至完全相反的设置;3,有些情况下需要对一个寄存器中的某一位或一位进行连续的不同的甚至完全相反的设置,而其余的位要保持不变;4,有时,对一个寄存器进行设置时,对其不同的位进行先后顺序不同的设置,即对其各个位有先后设置的顺序

陶野的窝 7239

位运算与寄存器之间的关系

嵌入式开发之位运算学习

qq_44714006的博客 1436
上一篇: 单链表排序
下一篇: 字符串全排列问题一
tkp2014
博客等级 码龄12年 137粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值