DIY编程器网

标题: 单片机c语言教程第八章--运算符和表达式(位运算符) [打印本页]

作者: liyf    时间: 2011-4-29 22:55
标题: 单片机c语言教程第八章--运算符和表达式(位运算符)
学过汇编的朋友都知道汇编对位的处理能力是很强的,但是单片机C语言也能对运算对象进行按位操作,从而使单片机C语言也能具有一定的对硬件直接进行操作的能力。位运算符的作用是按位对变量进行运算,但是并不改变参与运算的变量的值。如果要求按位改变变量的值,则要利用相应的赋值运算。还有就是位运算符是不能用来对浮点型数据进行操作的。单片机c语言中共有6种位运算符。位运算一般的表达形式如下:
变量 1 位运算符 变量 2 位运算符也有优先级,从高到低依次是:“"”(按位取反)→“>”(右
移) →“&”(按位与)→“^”(按位异或)→“|”(按位或)
表 8-1 是位逻辑运算符的真值表,X 表示变量 1,Y 表示变量 2


X

Y

"X

"Y

X&Y

X|Y

X^Y


0

0

1

1

0

0

0


0

1

1

0

0

1

1


1

0

0

1

0

1

1


1

1

0

0

1

1

0
表 8-1 按位取反,与,或和异或的逻辑真值表
利用以前建立起来的实验板,我们来做个实验验证一下位运算是否真是不改变参与变量 的值,同时学习位运算的表达形式。程序很简单,用 P1 口做运算变量,P1.0-P1.7 对应 P1 变量的最低位到最高位,通过连接在 P1 口上的 LED 我们便能直观看到每个位运算后变量 是否有改变或如何改变。程序如下:
#include
void main(void)
{
unsigned int a;
unsigned int b;
unsigned char temp; //临时变量
P1 = 0xAA; //点亮 D1,D3,D5,D7 P1 口的二进制为 10101010,为 0 时点亮 LED
for (a=0;a

P1 = P1 & 0x7; //这个时候 LED 会变得只有 D2 灭
//因为之前 P1=0xAA=10101010
//与 0x7 位与 0x7=00000111
//结果存入 P1 P1=00000010 //位为 O 时点亮 LED,电路看第三课
for (a=0;a
+=[/td]

加法赋值[/td]

>>=[/td]

右移位赋值[/td][/tr]
[tr]

-=[/td]

减法赋值[/td]

&=[/td]

逻辑与赋值[/td][/tr]
[tr]

*=[/td]

乘法赋值[/td]

|=[/td]

逻辑或赋值[/td][/tr]
[tr]

/=[/td]

除法赋值[/td]

^=[/td]

逻辑异或赋值[/td][/tr][/table]
%= 取模赋值 -= 逻辑非赋值


条件运算符
上面我们说过单片机C语言中有一个三目运算符,它就是“?:”条件运算符,它要求有三个运算对象。它能把三个表达式连接构成一个条件表达式。条件表达式的一般形式如下:
逻辑表达式? 表达式 1 : 表达式 2 条件运算符的作用简单来说就是根据逻辑表达式的值选择使用表达式的值。当逻辑表达
式的值为真时(非 0 值)时,整个表达式的值为表达式 1 的值;当逻辑表达式的值为假(值
为 0)时,整个表达式的值为表达式 2 的值。要注意的是条件表达式中逻辑表达式的类型可 以与表达式 1 和表达式 2 的类型不一样。下面是一个逻辑表达式的例子。
如有 a=1,b=2 这个时候我们要求是取 ab 两数中的较小的值放入 min 变量中,也许你会这样 写:
if (a
min = a;
else
min = b; //这一段的意思是当 a
用条件运算符去构成条件表达式就变得简单明了了:min = (a




欢迎光临 DIY编程器网 (http://diybcq.com/) Powered by Discuz! X3.2