C语言程序设计十二章位运算
C语言程序设计第十二章位运算 主要内容 12.1 位运算的概念 12.2 位运算 12.3 位运算举例 12.4 位段 12.1 位运算的概念 C语言是为描述系统而设计的,既具有高级语言的特点,又具有低级语言的功能,因而具有广泛的用途和很强的生命力。 在计算机用于检测和控制等诸多领域中要用到位运算的知识,因此读者应当学习和掌握本章的内容。 所谓位运算是指进行二进制位运算。例如,将一个存储单元中的各二进位左移或右移一位,两个数按位相加等。本章讲述C语言位运算的功能。 12.1 位运算的概念 计算机内数据的表示方法 计算机内存储器由许多称为字节的单元组成的,每个字节由8个二进制位(8bit)构成,每位的取值为0或1。最右端的位称为“最低位”,编号为0;最左端的位称为“最高位”,而且按从最低位到最高位顺序,依次编号。下图是一个字节数据和它各二进制位的编号。 计算机中数是用二进制来表示的,数的符号也是用二进制表示的。一般用最高位作为符号位,0表示正数,用1表示负数。 12.1 位运算的概念 补码 正数表示形式:符号位为0,其余部分表示数的绝对值。例如,+9的补码12.1 位运算的概念 负数表示形式: -9的绝对值按位取反后加1,符号位以1表示负数。由于计算机的字长不同,为方便描述,因此约定用一个字节表示一个整数。见下图: 12.1 位运算的概念 位运算及其运算符 所谓位运算是指,按二进制位进行的运算,即从具有0或1的运算对象出发,计算得出具有0或1的运算结果。C语言的位运算又分为按位操作和移位操作,位操作包括按位与、或、异或和求反运算;移位操作包括左移和右移操作 12.1 位运算的概念 说明 位运算的优先级:由高到低的顺序是:~ → << 、>> → & → | → ^; 位运算的运算对象只能是整型(int)或字符型(char)的数据; 位运算是对运算量的每一个二进制位分别进行; 12.2 位运算 按位与运算(&) 参加运算的两个数据,按二进位进行“与”运算。如果两个相应的二进位都为1,则该位的结果值为1,否则为0。即 0&0=0;0&1=0;1&0=0;1&1=1; 例如: 3&5 并不等于8,应该是按位与。 3 = 0 0 0 0 0 0 1 1 & 5 = 0 0 0 0 0 1 0 1 1 = 0 0 0 0 0 0 0 1 因此,3&5的值得1。如果参加&运算的是负数(如-3 & -5),则以补码形式表示为二进制数,然后按位进行“与”运算。 12.2 位运算 按位与的实际用途 将一个数的某位清零 如果想将某个数的某个比特清零,只要另找一个数,让对应的该比特置0,然后使两数进行按位与&运算,即可达到将此数的特定比特清零的目的。 如:有数想让该数从右数的第4比特变成0,其他位保持不变。我们另找一个数,该数从右数的第4比特设它为0,其他位全为1将两个数进行&运算: 0 0 1 0 1 0 1 1 & 1 1 1 1 0 1 1 1 0 0 1 0 0 0 1 1 12.2 位运算 取一个数中某些指定位 如有一个两个字节整数 a=(16a1)16,想取出其中的低字节。我们构造一个数b,它的高字节全为0,低字节全为1,即b=(00ff)16=(255)10,只需将a与b按位与即可: a = (16a1)16 = (0001011010100001)2 & b = (00ff )16 = (0000000011111111)2 (00a1)16 = (0000000010100001)2 12.2 位运算 按位或运算(|) 两个相应的二进位中只要有一个为1,该位的结果值为1。即0|0=0; 0|1=1; 1|0=1; 1|1=1。 例如: (060)8 | (017)8 , 将八进制数60与八进制数17进行按位或运算: (060)8 = (0 0 1 1 0 0 0 0)2 | (017)8 = (0 0 0 0 1 1 1 1)2 (077)8 = (0 0 1 1 1 1 1 1)2 按位或常用