3-4、位运算符和位表达式

148 阅读4分钟

位运算符

为了节省内存空间,系统中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。C语言提供了将标志状态从标志字节中分离出来的位运算功能。位运算是按二进制位进行的运算,运算对象只能是整型(包括字符型)数据,运算结果仍为整型。例如,对一个字节的数据(字符型)进行位运算时,同时对其8个二进制位进行运算,运算结果是1字节数;对2个字节的数据(短整型、无符号短整型)进行位运算时,同时对其16个二进制位进行运算,运算结果是2字节数;对4个字节的数据(长整型、无符号长整型)进行位运算时,同时对其32个二进制位进行运算,运算结果是4字节数;

位运算符分为位逻辑运算符和位移位运算符。

在介绍位运算符之前,先介绍一下计算机中的数值是如何表示的。

计算机中数值的表示

1、二进制位与字节
计算机的内存是由许多称为字节的单元组成的,1个字节由8个二进制位(bit/比特)组成,每个二进制位的值为0或1。最右端的一位称为“最低位”,编号为0;最左端的一位称为“最高位”,编号为7,而且从最低位到最高位依次编号。

image.png

2、数值的原码表示
数值的原码表示是指将最高位作为符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值(以二进制形式表示)的表示形式。

例如:+5的原码是

image.png

-5的原码是

image.png

3、数值的反码表示
数值的反码表示分为两种情况:
1、正数的反码与原码相同 2、负数反码的符号位为1,其余各位按该数绝对值的原码按位取反(0变1、1变0)

如-5的反码是

image.png

4、数值的补码表示
数值的补码表示也分两种情况:
1、正数的补码与原码相同。
2、负数补码的符号位为1,其余各位按该数绝对值的原码按位取反,然后在末尾加1

注:计算机系统中整数一律采用补码表示(存储),原因在于使用补码,可以将符号位和其他位统一处理;同时,减法也可以按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

image.png

位逻辑运算符

位逻辑运算数据中的每个二进制上的 0 或 1 作为逻辑值,按位进行逻辑运算。位逻辑运算符分为按位非(~)、按位与(&)、按位或( | )和按位异或(^)(又称按位加)四种,其中按位非是单目运算符,其余三种都是三目运算符。

1、运算对象只能是整型或字符型数据,除按位非为单目运算符外,其余均为双目运算符。
2、参与位逻辑运算时,运算对象以二进制形式进行相应的按位运算。

位逻辑运算符的优先级如下:
1、~ 优先于 双目算术运算符 优先于 关系运算符 优先于 & 优先于 ^ 优先于 | 优先于双目逻辑运算符。
2、~ 与单目逻辑运算符、自增、自减、单目算术运算符、长度运算符的优先级相同,结合性是从右至左。

注:以上运算都是以二进制方式进行的,例如:9|5 ,将9和5转换为二进制,然后每一位进行 按位或(|)运算得出结果。

作用
位逻辑运算符用于对数据中的二进制位进行测试、置位。
1、按位与(&):提取/保留一个数的(某/某些)位,其余各位置 0。
2、按位或(|):将一个数的(某/某些)位置1,其余各位不变。
3、按位异或(^):使一个数的(某/某些)位翻转(即原来为1的变为0,为0的变为1),其余各位不变。
4、按位非:间接地构造一个数,以增强程序的可移植性。

位移位运算符

位移位运算符是将数据作为二进制数,进行向左或向右移动若干位的运算,分为左移和右移,均为双目运算符,第一个运算对象是移位对象,第二个运算对象是移位的二进制数。

a << b //a向左移b位
a >> b //a向右移b位

注:
1、运算对象只能是整型或字符型数据
2、参与位移位运算时,运算对象以二进制形式进行相应的按位运算。