51单片机位操作

合集下载

51单片机位操作指令

51单片机位操作指令

JC:如果Cy为1,则跳转到目标地址,否则执 行下一条指令 JNC:如果Cy为0,则跳转到目标地址,否则 执行下一条指令 JB:如果bit为1,则跳转到目标地址,否则执 行下一条指令 JNB:如果Cy为0,则跳转到目标地址,否则 执行下一条指令 JBC:如果bit为1,则先将bit清零,再跳转到 目标地址,否则执行下一条指令
位变量逻辑运算指令
ANL C,bit ANL C,/bit ORL C,bit ORL C,/bit
C都是在前面的!
ANL:可寻址位和Cy执行“逻辑与”操作,结果 存放在Cy,不影响可寻址位
ORL:可寻址位和Cy执行“逻辑或”操作,结果 存放在Cy,不影响可寻址位
前面加一个“/”表示使用反码与Cy执行逻辑操 作,仍不影响可寻址位
• 可见20H是位地址还是字节地址要看另一个操 作数的类型。
分类:
1.位传送指令 2.位变量修改指令 3.位变量逻辑运算指令 4.位条件相对转移指令
位传送指令
MOV C,bit MOV bit,C
注意:这里的bit都是位地址
这组指令的功能是实现位累加器(CY)和其它位 地址之间的数据传递。
例: MOV C,30H ;位地址(30H)→ Cy
位操作指令
主讲人:王大臣
一位就是一盏灯的亮和灭
• 我们之前学的指令全都是用“字节”来介 绍的:字节的移动、加法、减法、逻辑运算、 移位等等。用字节来处理一些数学问题,比如 说:控制冰箱的温度、电视的音量等等很直观, 可以直接用数值来表示。可是如果用它来控制 一些开关的打开和合上,灯的亮和灭,就有些 不直接了?我们知道送往P1口的数值后并不能 马上知道哪个灯亮和来灭,而是要化成二进制 才知道。工业中有很多场合需要处理这类开关 输出,继电器吸合,用字节来处理就显示有些 麻烦,所以在8051单片机中特意引入一个位处 理机制。

51单片机位操作指令

51单片机位操作指令

51单片机位操作指令摘要:1.51 单片机简介2.位操作指令概述3.常见位操作指令a.位清零指令b.位置位指令c.位取反指令d.位测试指令4.位操作指令应用实例a.简单按键控制b.计数器应用c.矩阵键盘扫描5.位操作指令在51 单片机中的重要性正文:51 单片机是一种广泛应用的8 位微控制器,其功能强大且成本低廉,被广泛应用于嵌入式系统和自动控制领域。

在51 单片机的指令系统中,位操作指令占据着重要地位,它们可以实现对单片机内部寄存器和外设状态的快速操作。

位操作指令主要针对单个二进制位进行操作,包括位清零指令、位置位指令、位取反指令和位测试指令等。

这些指令可以实现对二进制数据的设置、检测和修改等功能,为实际应用提供了极大的便利。

位清零指令(如CLR)用于将指定寄存器的某一位设置为0。

例如,我们可以使用CLR P1.0 来将P1 寄存器的第0 位清零。

位置位指令(如SETB)则用于将指定寄存器的某一位设置为1。

例如,我们可以使用SETB P1.0 来将P1 寄存器的第0 位设置为1。

位取反指令(如CPL)用于将指定寄存器的某一位取反,即0 变1,1 变0。

例如,我们可以使用CPL P1.0 来将P1 寄存器的第0 位取反。

位测试指令(如JC、JNC、JB、JNB 等)用于根据指定寄存器的某一位的值来决定程序的执行流程。

例如,我们可以使用JC P1.0 来检查P1 寄存器的第0 位是否为1,若为1 则跳转到指定地址执行程序。

位操作指令在实际应用中有着广泛的应用。

例如,我们可以使用位清零指令和位置位指令来实现简单按键的控制,根据按键的状态来控制LED 灯的点亮和熄灭。

又如,我们可以使用位操作指令来实现计数器功能,通过位清零指令和位测试指令来计数和判断计数器是否达到预定值。

此外,位操作指令还可以应用于矩阵键盘扫描,通过位操作指令来检测并识别按键的按下。

总之,位操作指令在51 单片机中具有举足轻重的地位,掌握这些指令的使用方法对于进行51 单片机编程至关重要。

一个操作51单片机某几个IO口的方法

一个操作51单片机某几个IO口的方法

一个操作51单片机某几个IO口的方法
今天有同学学习《手把手教你学51单片机》过程中遇到一个关于51单片机IO口操作的问题,可能有其他同学有类似疑问,或者是其他同学根本没有考虑过这个疑问问题,我简单提一下,今后有类似问题也欢迎大家留言,我会给大家解释。

问题很简单,但是对于初学者常犯。

对于51单片机的P口来说,我们习惯上的赋值是P1 = 0xXX。

但是这样操作是一次性操作了8个IO口。

而有些情况下,我们只需要操作其中的几个而不是全部的时候,我们如何操作呢?如下图注释上边的部分,是我写的程序代码。

这个是操作51单片机P1口的低4位对步进电机进行操作的程序,在这个操作过程中,我们只使用到了P1口的低4位,因此我们希望高4位保持不变,只改变P1的低4位。

首先把P1进行一个备份到变量tmp中去,然后把变量tmp的经过两条语句,得到最终要赋值给P1的值以后,再一次性赋值给P0,这个方法大家都可以学习一下。

而注释下边的这段程序,是一位同学写的,这位同学的理由是下边这种写法,也没有改变P1的高4位。

表面看也没什么问题,但是实际上如果不利用tmp这个变量,P1就会产生一个错误的中间值。

P1= P1&0xF0;这条语句执行完毕以后,P1 = 0xX0;其中X是未知的,保持了之前P1的高4位的原值,而低4位是0;
再然后P1= P1|BeatCode[index];这样操作后,P1得到了最终的值。

但是这中间,P1 = 0xX0;这个值是我们根本不需要的一个错误值。

不要怕有问题,但是我也不希望没有经过思考的问题。

而这个问题,就是同学经过思考的问题,我认为很好,写出来提供给同学们共同学习。

51单片机学习06-位指令转移指令

51单片机学习06-位指令转移指令
目标地址 0002 减下一址 - 0013 获rel字节 FFEF 字节 rel的单字节补码 ∴rel= -128~+127(相对于下一指令址的跳转偏移量 的单字节补码 相对于下一指令址的跳转偏移量) 相对于下一指令址的跳转偏移量
Relative
执行相对转移: 执行相对转移:PC ←
目标地址 下一指令址 + 偏移量
硬件逻辑电路图
【例B3-14】如下控制梯形图,请用MCS-51程序实现: B3-14】如下控制梯形图,请用MCS-51程序实现: MCS 程序实现 MOV C , P1.3 ANL C , P1.2 ORL C , P2.1 ANL C , /P2.0 MOV P2.0 , C ;取P1.3 取 ;串联 串联P1.2 串联 ;并联 P2.1 并联 ;串联 P2.0常闭点 串联 常闭点 ;输出 P2.0 输出
ORG 0030H MAIN:MOV A , #56H ADD A , #67H DA A MOV 30H , A SJMP $ END
PC
;
目标地址 下一指令址 + 偏移量 0030H ← 0002H + 0046H
rel=[目标地址 下一指令址] 目标地址+ rel ;∴rel=[目标地址-下一指令址]低8位
【例3-12】 MOV 12】 MOV
C , 06H 20H.6 P1.0 ,C
90H或 90H或90H.0
;20H.6→Cy ;Cy→P1.0
P.45
【例3-13】 13】 CLR CLR CPL SETB C
24H.7
;0→Cy ;0→24H.7位 0→24H.7位 求反→21H.0位 ;21H.0 求反→21H.0位 ;1→P1.7位 1→P1.7位

51单片机位操作

51单片机位操作

C51单片机位操作方法C51对位的操控能力是非常强大的。

从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点。

这也是在各个领域中都可以看到C的重要原因。

在这一节中将详细讲解C51中的位操作及其应用。

1、位运算符C51提供了几种位操作符,如下表所示:1)“按位与”运算符(&)参加运算的两个数据,按二进位进行“与”运算。

原则是全1为1,有0为0,即:0&0=0; 0&1=0; 1&0=0; 1&1=1;如下例:a=5&3; //a=(0b 0101) & (0b 0011) =0b 0001 =1那么如果参加运算的两个数为负数,又该如何算呢?会以其补码形式表示的二进制数来进行与运算。

a=-5&-3; //a=(0b 1011) & (0b1101) =0b 1001 =-7在实际的应用中与操作经常被用于实现特定的功能:1.清零“按位与”通常被用来使变量中的某一位清零。

如下例:a=0xfe; //a=0ba=a&0x55;//使变量a的第1位、第3位、第5位、第7位清零a= 0b2.检测位要知道一个变量中某一位是‘1’还是‘0’,可以使用与操作来实现。

a=0xf5; //a=0bresult=a&0x08; //检测a的第三位,result=03.保留变量的某一位要屏蔽某一个变量的其它位,而保留某些位,也可以使用与操作来实现。

a=0x55; //a=0ba=a&0x0f; //将高四位清零,而保留低四位a=0x052)“按位或”运算符(|)参与或操作的两个位,只要有一个为‘1’,则结果为‘1’。

即有‘1’为‘1’,全‘0’为‘0’。

0|0=0; 0|1=1; 1|0=1; 1|1=1;例如:a=0x30|0x0f; //a=(0b)|(0b)=(0b)=0x3f“按位或”运算最普遍的应用就是对一个变量的某些位置‘1’。

常见51单片机指令及详解

常见51单片机指令及详解

常见51单片机指令及详解1. 简介单片机是一种集成电路,具备处理和控制功能。

51单片机是指Intel公司推出的一系列8位单片机,常用于嵌入式系统和物联网设备。

本文将介绍一些常见的51单片机指令,并对其进行详解。

2. 数据传送指令2.1 MOV指令MOV指令用于将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。

例如:MOV A, #10 ;将立即数10传送给累加器AMOV R0, R1 ;将寄存器R1的值传送给R02.2 XCH指令XCH指令用于交换两个寄存器或内存位置中的数据。

例如:XCH A, B ;交换累加器A和B的值3. 算术运算指令3.1 ADD指令ADD指令用于将两个操作数相加,并将结果保存在累加器中。

例如:ADD A, B ;将累加器A和寄存器B的值相加,结果存储在A中3.2 SUBB指令SUBB指令用于将第二个操作数的补码与累加器的值相减,并将结果存储在累加器中。

例如:SUBB A, B ;将B的补码与累加器A的值相减,结果存储在A中4. 逻辑运算指令4.1 ANL指令ANL指令用于对两个操作数进行按位与运算,并将结果存储在目的操作数中。

例如:ANL A, B ;将累加器A和寄存器B的值按位与,结果存储在A 中4.2 ORL指令ORL指令用于对两个操作数进行按位或运算,并将结果存储在目的操作数中。

例如:ORL A, B ;将累加器A和寄存器B的值按位或,结果存储在A 中5. 跳转指令5.1 JMP指令JMP指令用于无条件跳转至指定的目标地址。

例如:JMP 2000H ;跳转至内存地址2000H处执行指令5.2 JZ指令JZ指令用于在累加器为零时跳转至指定的目标地址。

例如:JZ 3000H ;当累加器为零时,跳转至内存地址3000H处执行指令6. 输入输出指令6.1 IN指令IN指令用于将外部设备的数据输入到累加器或指定的寄存器中。

例如:IN A, P1 ;将P1端口的数据输入到累加器A中6.2 OUT指令OUT指令用于将累加器或指定的寄存器中的数据输出到外部设备。

51单片机指令表汇总

51单片机指令表汇总

51单片机指令表汇总51 单片机是一种广泛应用于电子工程和嵌入式系统开发的微控制器。

要熟练掌握 51 单片机的编程,了解其指令表是至关重要的。

下面就为大家汇总一下 51 单片机的常见指令。

数据传送类指令MOV 指令:这是最基本的数据传送指令,用于在寄存器之间、寄存器与存储器之间传送数据。

例如,“MOV A, 50H”就是将立即数 50H传送到累加器 A 中。

MOVX 指令:用于在片外数据存储器和累加器 A 之间进行数据传送。

比如“MOVX A, @DPTR”,将片外数据存储器中由数据指针 DPTR 所指定单元的内容传送到累加器 A 中。

MOVC 指令:用于访问程序存储器中的数据表格。

“MOVC A, @A+DPTR”是常见的用法。

算术运算类指令ADD 指令:实现加法运算。

像“ADD A, R0”就是将累加器 A 的内容和寄存器 R0 的内容相加,结果存放在累加器 A 中。

ADDC 指令:带进位加法指令。

考虑了上一次运算产生的进位标志。

SUBB 指令:用于减法运算,并且会考虑借位标志。

逻辑运算类指令ANL 指令:进行逻辑与操作。

例如“ANL A, R0”,将累加器 A 和寄存器 R0 的内容进行逻辑与运算,结果存放在累加器 A 中。

ORL 指令:执行逻辑或操作。

XRL 指令:实现逻辑异或运算。

控制转移类指令JC 指令:若进位标志为 1 则跳转。

JZ 指令:若累加器 A 的内容为 0 则跳转。

LJMP 指令:长跳转指令,可以跳转到 64KB 程序存储器空间的任意位置。

位操作类指令SETB 指令:将指定的位设置为 1。

例如“SETB P10”,将 P1 端口的第 0 位置 1。

CLR 指令:把指定的位清零。

这些只是 51 单片机指令的一部分,实际应用中还有更多的指令和组合使用方式。

在编程时,合理选择和运用这些指令能够实现各种复杂的功能。

比如,通过数据传送指令来初始化变量和读取外部数据;利用算术运算指令进行数值计算;借助逻辑运算指令处理逻辑关系;使用控制转移指令实现程序的分支和循环;运用位操作指令控制单个引脚的状态。

51单片机汇编语言教程:15课单片机位操作指令

51单片机汇编语言教程:15课单片机位操作指令

51 实验板推荐(点击下面的图片可以进入下载资料链接)
HJ-1G
HJ-3G
推荐使用慧净 51 实验板。推荐 51 学习网 淘宝网:/
推荐使用慧净 51 实验板。推荐 51 学习网 淘宝网:/
51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28 课)
位或指令 ORL C,bit ORL C,/bit 这个的功能大家自行分析吧,然后对照上面的例程,编一个验证程序,看看你相得对吗? 位条件转移指令 判 CY 转移指令 JC rel JNC rel 第一条指令的功能是如果 CY 等于1就转移,如果不等于1就次序执行。那么转移到什么地方 去呢?我们能这样理解:JC 标号,如果等于1就转到标号处执行。这条指令我们在上节课中 已讲到,不再重复。 第二条指令则和第一条指令相反,即如果 CY=0就转移,不等于0就次序执行,当然,我们也 同样理解: JNC 标号 判位变量转移指令 JB bit,rel JNB bit,rel 第一条指令是如果指定的 bit 位中的值是1,则转移,不然次序执行。同样,我们能这样理 解这条指令:JB bit,标号 第二条指令请大家先自行分析 下面我们举个例程说明: ORG 0000H LJMP START ORG 30H START:MOV SP,#5FH MOV P1,#0FFH MOV P3,#0FFH L1: JNB P3.2,L2 ;P3.2上接有一只按钮,它按下时,P3.2=0 JNB P3.3,L3 ;P3.3上接有一只按钮,它按下时,P3.3=0 LJM P L1 L2: MOV P1,#00H
推荐使用慧净 51 实验板。推荐 51 学习网 淘宝网:/
51 单片机汇编语言教程-慧净电子会员收集整理 (全部 28 课)
MOV P1.0,CY ;将 P1.0的状态送给 CY。 位修正指令 位清0指令 CLR C ;使 CY=0 CLR bit ;使指令的位地址等于0。例:CLR P1.0 ;即使 P1.0变为0 位置1指令 SETB C ;使 CY=1 SETB bit ;使指定的位地址等于1。例:SETB P1.0 ;使 P.0变为1 位取反指令 CPL C ;使 CY 等于原来的相反的值,由1变为0,由0变为1。 CPL bit ;使指定的位的值等于原来相反的值,由0变为1,由1变为0。 例:CPL P1.0 以我们做过的实验为例,如果原来灯是亮的,则执行本指令后灯灭,反之原来灯是灭的,执 行本指令后灯亮。 位逻辑运算指令 位与指令 ANL C,bit ;CY 与指定的位地址的值相与,结果送回 CY ANL C,/bit ;先将指定的位地址中的值取出后取反,再和 CY 相与,结果送回 CY,但注意, 指定的位地址中的值本身并不发生变化。 例:ANL C,/P1.0 设执行本指令前,CY=1,P1.0等于1(灯灭),则执行完本指令后 CY=0,而 P1.0也是等于1。 可用下列程序验证: ORG 0000H AJMP START ORG 30H START: MOV SP,#5FH MOV P1,#0FFH SETB C ANL C,/P1.0 MOV P1.1,C ;将做完的结果送 P1.1,结果应当是 P1.1上的灯亮,而 P1.0上的灯还是不亮
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C51单片机位操作方法[日期:2010-10-21 ] [来源:本站原创作者:佚名] [字体:大中小] (投递新闻)C51对位的操控能力是非常强大的。

从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点。

这也是在各个领域中都可以看到C的重要原因。

在这一节中将详细讲解C51中的位操作及其应用。

1、位运算符C51提供了几种位操作符,如下表所示:运算符含义运算符含义&按位与~取反|按位或<<左移^按位异或>>右移1)“按位与”运算符(&)参加运算的两个数据,按二进位进行“与”运算。

原则是全1为1,有0为0,即:0&0=0; 0&1=0; 1&0=0; 1&1=1;如下例:a=5&3; //a=(0b 0101) & (0b 0011) =0b 0001 =1那么如果参加运算的两个数为负数,又该如何算呢?会以其补码形式表示的二进制数来进行与运算。

a=-5&-3; //a=(0b 1011) & (0b1101) =0b 1001 =-7在实际的应用中与操作经常被用于实现特定的功能:1.清零“按位与”通常被用来使变量中的某一位清零。

如下例:a=0xfe; //a=0b 11111110a=a&0x55;//使变量a的第1位、第3位、第5位、第7位清零a= 0b 01010100 2.检测位要知道一个变量中某一位是‘1’还是‘0’,可以使用与操作来实现。

a=0xf5; //a=0b 11110101result=a&0x08; //检测a的第三位,result=03.保留变量的某一位要屏蔽某一个变量的其它位,而保留某些位,也可以使用与操作来实现。

a=0x55; //a=0b 01010101a=a&0x0f; //将高四位清零,而保留低四位a=0x052)“按位或”运算符(|)参与或操作的两个位,只要有一个为‘1’,则结果为‘1’。

即有‘1’为‘1’,全‘0’为‘0’。

0|0=0; 0|1=1; 1|0=1; 1|1=1;例如:a=0x30|0x0f; //a=(0b00110000)|(0b00001111)=(0b00111111)=0x3f “按位或”运算最普遍的应用就是对一个变量的某些位置‘1’。

如下例:a=0x00; //a=0b 00000000a=a|0x7f; //将a的低7位置为1,a=0x7f3)“异或”运算符(^)异或运算符^又被称为XOR运算符。

当参与运算的两个位相同(‘1’与‘1’或‘0’与‘0’)时结果为‘0’。

不同时为‘1’。

即相同为0,不同为1。

0^0=0; 0^1=1; 1^0=1;1^1=0;例如:a=0x55^0x3f; //a=(0b01010101)^(0b00111111)=(0b01101010)=0x6a 异或运算主要有以下几种应用:1.翻转某一位当一个位与‘1’作异或运算时结果就为此位翻转后的值。

如下例:a=0x35; //a=0b00110101a=a^0x0f; //a=0b00111010 a的低四位翻转关于异或的这一作用,有一个典型的应用,即取浮点的相反数,具体的实现如下:f=1.23; //f为浮点型变量值为1.23f=f*-1; //f乘以-1,实现取其相反数,要进行一次乘运算f=1.23;((unsigned char *)&f)[0]^=0x80; //将浮点数f的符号位进行翻转实现取相反数2.保留原值当一个位与‘0’作异或运算时,结果就为此位的值。

如下例:a=0xff; //a=0b11111111a=a^0x0f; //a=0b11110000 与0x0f作异或,高四位不变,低四位翻转3.交换两个变量的值,而不用临时变量要交换两个变量的值,传统的方法都需要一个临时变量。

实现如下:void swap(unsigned char *pa,unsigned char *pb){unsigned char temp=*pa;//定义临时变量,将pa指向的变量值赋给它*pa=*pb;*pb=temp;//变量值对调}而使用异或的方法来实现,就可以不用临时变量,如下:void swap_xor(unsigned char *pa,unsigned char *pb){*pa=*pa^*pb;*pb=*pa^*pb;*pa=*pa^*pb; //采用异或实现变量对调}从上例中可以看到异或运算在开发中是非常实用和神奇的。

4)“取反”运算符(~)与其它运算符不同,“取反”运算符为单目运算符,即它的操作数只有一个。

它的功能就是对操作数按位取反。

也就是是‘1’得‘0’,是‘0’得‘1’。

~1=0; ~0=1;如下例:a=0xff; //a=0b11111111a=~a; //a=0b000000001.对小于0的有符号整型变量取相反数d=-1;//d为有符号整型变量,赋值为-1,内存表示为0b 11111111 11111111d=~d+1; //取d的相反数,d=1,内存表示0b 00000000 00000001此例运用了负整型数在内存以补码方式来存储的这一原理来实现的。

负数的补码方式是这样的:负数的绝对值的内存表示取反加1,就为此负数的内存表示。

如-23如果为八位有符号整型数,则其绝对值23的内存表示为0b00010111,对其取反则为0b11101000,再加1为0b11101001,即为0XE9,与Keil仿真结果是相吻合的:2.增强可移植性关于“增强可移植性”用以下实例来讲解:假如在一种单片机中unsigned char类型是八个位(1个字节),那么一个此类型的变量a=0x67,对其最低位清零。

则可以用以下方法:a=0x67; //a=0b 0110 0111a=a&0xfe; //a=0b 0110 0110上面的程序似乎没有什么问题,使用0xfe这一因子就可以实现一个unsigned char型的变量最低位清零。

但如果在另一种单片机中的unsigned char类型被定义为16个位(两个字节),那么这种方法就会出错,如下:b=0x6767; //假设b为另一种单片机中的unsigned char 类型变量,值为0b 0110 0111 0110 0111b=b&0xfe; //如果此时因子仍为0xfe的话,则结果就为0b 00000000 0110 0110 即0x0066,而与0x6766不相吻合上例中的问题就是因为不同环境中的数据类型差异所造成的,即程序的可移植性不好。

对于这种情况可以采用如下方法来解决:a=0x67; //a=0b 0110 0111a=a&~1; //在不同的环境中~1将自动匹配运算因子,实现最后一位清零a=0x66 其中~1为0b 11111110b=0x6767; //a=0b 0110 0111 0110 0111b=a&~1; //~1=0b 1111 1111 1111 1110,b=0b 0110 0111 01100110 ,即0x67665)左移运算符(<<)左移运算符用来将一个数的各位全部向左移若干位。

如:a=a<<2表示将a的各位左移2位,右边补0。

如果a=34(0x22或0b00100010),左移2位得0b10001000,即十进制的136。

高位在左移后溢出,不起作用。

从上例可以看到,a被左移2位后,由34变为了136,是原来的4倍。

而如果左移1位,就为0b01000100,即十进制的68,是原来的2倍,很显然,左移N位,就等于乘以了2N。

但一结论只适用于左移时被溢出的高位中不包含‘1’的情况。

比如:a=64; //a=0b 0100 0000a=a<<2; //a=0b 0000 0000其实可以这样来想,a为unsigned char型变量,值为64,左移2位后等于乘以了4,即64X4=256,而此种类型的变量在表达256时,就成为了0x00,产生了一个进位,即溢出了一个‘1’。

在作乘以2N这种操作时,如果使用左移,将比用乘法快得多。

因此在程序中适应的使用左移,可以提高程序的运行效率。

6)右移运算符右移与左移相类似,只是位移的方向不同。

如:a=a>>1表示将a的各位向右移动1位。

与左移相对应的,左移一位就相当于除以2,右移N位,就相当于除以2N。

在右移的过程中,要注意的一个地方就是符号位问题。

对于无符号数右移时左边高位移和‘0’。

对于有符号数来说,如果原来符号位为‘0’,则左边高位为移入‘0’,而如果符号位为‘1’,则左边移入‘0’还是‘1’就要看实际的编译器了,移入‘0’的称为“逻辑右移”,移入‘1’的称为“算术右移”。

Keil中采用“算术右移”的方式来进行编译。

如下:d=-32; //d为有符号整型变量,值为-32,内存表示为0b 11100000d=d>>1;//右移一位d为0b 11110000 即-16,Keil采用"算术逻辑"进行编译7)位运算赋值运算符在对一个变量进行了位操作中,要将其结果再赋给该变量,就可以使用位运算赋值运算符。

位运算赋值运算符如下:&=, |=,^=,~=,<<=, >>=例如:a&=b相当于a=a&b,a>>=2相当于a>>=2。

8)不同长度的数据进行位运算如果参与运算的两个数据的长度不同时,如a为char型,b为int型,则编译器会将二者按右端补齐。

如果a为正数,则会在左边补满‘0’。

若a为负数,左边补满‘1’。

如果a为无符号整型,则左边会添满‘0’。

a=0x00; //a=0b 00000000d=0xffff; //d=0b 11111111 11111111d&=a; //a为无符号型,左边添0,补齐为0b 00000000 00000000,d=0b 00000000 00000000。

相关文档
最新文档