21.1.4 位操作
1.嵌入式系统总是要求用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a的bit 3。在以上两个操作中,要保持其他的位不变。
分析:位操作是C51中的常用命令,对于80C51芯片中的一些存储区域可直接定义sbit变量的形式并进行操作。本题要求对一个普通变量的位进行操作,不能采用这种方式。
详细参考答案如下所示。
(1)对于一个普通变量要设置其某一位,可先定义一个其他位全为0,而该位为1的数,然后通过位逻辑或运算,即可指定位。类似的,通过位逻辑与运算,即可清除指定位。以下代码可完成该操作:
int a;
void set_bit3(void)
{
a|=0x4;
}
void clear_bit3(void)
{
a&=~0x4;
}
(2)更好的写法是编写一个具有较高移植性的代码,可通过预处理指令#define来进行该操作,具体代码如下:
int a;
define BIT3(0x1<<3)
void set_bit3(void)
{
a|=BIT3;
}
void clear_bit3(void)
{
a&=~BIT3;
}
2.有2个正整数x和y,现要求不用第3个临时变量将这2个变量的值进行交换。
提示可用位运算来完成。
分析:通过位异或运算,将两个变量对应位不同的位置1,相同的位置0,经过3次异或操作,即可将两个变量的值进行互换。
参考答案:
x^=y;
y^=x;
x^=y;
3.下列表达式中x的值为多少?
int x=1<<2+1;
分析:本题主要考查运算符的优先顺序。刚看到考题时,首先想到的是1左移两位得到6然后再加1,结果为7,但这是错误的答案。在以上表达式中,运算符“+”的优先级大于左移位“<<”,因此应该是将整数1左移3位。
参考答案:表达中x的值为8。
4.下列表达式中x的值为多少?
int x=7>>1;
分析:本题主要考查移位运算符的使用,向右移1位相当于对操作数进行除2操作。参考答案:x的值为3。