首页 理论教育C语言程序设计基础(第3版):位运算符详解

C语言程序设计基础(第3版):位运算符详解

【摘要】:C语言中,提供了用于二进制位操作的运算符以及复合运算符对程序设计中的位运算提供支持,见表11.1。表11.1C语言中的位运算符1.按位与运算符(&)按位与运算符(&)是一个双目运算符,其功能是:将参加操作的两个对象的各个二进制位分别对应进行“与”运算,即:两者都为1时结果为1,否则结果为0。例如,把整型变量a的低16位置1,保留高16位,可以通过对变量a施加a|0xffff运算实现。按位异或运算示例。

C语言中,提供了用于二进制位操作的运算符以及复合运算符对程序设计中的位运算提供支持,见表11.1。

表11.1 C语言中的位运算符

1.按位与运算符(&)

按位与运算符(&)是一个双目运算符,其功能是:将参加操作的两个对象的各个二进制位分别对应进行“与”运算,即:两者都为1时结果为1,否则结果为0。

按位与运算通常用来对被操作数据对象的某些位清0或保留某些位。例如,把整型变量a的高16位清0,保留数据的低16位,可以对变量a进行a&65535运算(65535对应的二进制数为00000000000000001111111111111111)。位运算的表达式中,描述整型常量时使用16进制书写形式更为方便和简单明了,例如,a&65535可以用十六进制常数的形式写为a&0xffff。

【例11.4】 按位与运算示例。

运行该程序,当输入数据为:128,64时,结果为x&y=0。其运算过程为:

2.按位或运算符(|)

按位或运算符(|)是一个双目运算符,其功能是:将参加操作的两个对象的各个二进制位分别对应进行“或”运算,即:两者都为0时结果为0,否则结果为1。

按位或运算常用来将被操作数某些位置1,而保持其他位不变。例如,把整型变量a的低16位置1,保留高16位,可以通过对变量a施加a|0xffff运算实现(0xffff对应的二进制数为00000000000000001111111111111111)。

【例11.5】 按位或运算示例。

运行该程序,当输入数据为:128,64时,结果为x|y=192。其运算过程为:

3.按位异或运算符(^)

按位异或运算符(^)是一个双目运算符,其功能是:将参加操作的两个对象的各个二进制位分别对应进行“异或”运算,运算规则为:两者值相同时结果为0,否则结果为1。

按位异或运算常用于将被操作数某些特定位的值取反,例如,把整型变量a的低16位值取反,保留高16位,可以通过对变量a施加a^0xffff运算实现(0xffff对应的二进制数为

00000000000000001111111111111111)。

【例11.6】 按位异或运算示例。

运行该程序,当输入数据为:128,64时,结果为x^y=192。其运算过程为:

4.按位取反运算符(~)

按位取反运算符(~)是一个单目运算符,其功能是:将参加操作的对象的各个二进制位进行“取反”操作,即:0变为1,1变为0。

【例11.7】 按位取反运算示例。

运行该程序,当输入数据为:128时,结果为~x=4294967167。其运算过程为:

5.左移运算符(<<)

左移运算符(<<)是一个双目运算符,其功能是:将参加操作的左操作数的全部二进制位向左移动右操作数指定的位数,左移出去的数位丢失,左移后数的右边补0。例如,a<<3表示将a中的各位全部向左移动3位。在计算机系统中,只要没有出现溢出现象(即移位后的数据仍在取值范围之内),那么某数左移一位相当于将该数乘2,左移两位相当于将该数乘4,以此类推。

【例11.8】 左移运算示例。(www.chuimin.cn)

运行该程序,当输入数据为:128,移动位数为:2时,结果为x<<2=512。其运算过程为:

当输入数据为:128,移动位数为:25时,出现溢出现象,结果为x<<25=0。其运算过程为:

6.右移运算符(>>)

右移运算符(>>)是一个双目运算符,其功能是:将参加操作的左操作数的全部二进制位向右移动右操作数指定的位数,右移出去的数位丢失,右移后左边留下的空位填充取决于左操作对象的数据类型。

①对无符号数据(unsigned char和unsigned int),左边补0。

②对有符号数据(int和char)左边补其符号位,即正数补0、负数补1。

与左移运算类似,如果移位后没有溢出,右移1位相当于将该数除以2。

【例11.9】 右移运算示例。

运行该程序,当输入数据为:128,移动位数为:2时,结果为x>>2=32。其运算过程为: