清华大学出版社 TSINGHUA UNIVERSITY PRESS 第12章 位运算 12.1 位运算符和位运算 12.2 位运算举例 12.3 位段 习题
第12章 位运算 12.1 位运算符和位运算 12.2 位运算举例 12.3 位段 习题
清华大学出版社 TSINGHUA UNIVERSITY PRESS ·C语言是为描述系统而设计的,因此它应当具有汇编 语言所能完成的一些功能。C语言既具有高级语言的 特点,又具有低级语言的功能,因而具有广泛的用途 和很强的生命力。第9章介绍的指针运算和本章将介 绍的位运算就很适合于编写系统软件的需要,是C语 言的重要特色。在计算机用于检测和控制领域中要用 到位运算的知识,因此读者应当学习和掌握本章的内 容。 。 所谓位运算是指进行二进制位的运算。在系统软件中, 常要处理二进位的问题。例如,将一个存储单元中的 各二进位左移或右移一位,两个数按位相加等。C语 言提供位运算的功能,与其他高级语言(如PASCAL) 相比,它显然具有很大的优越性
• C语言是为描述系统而设计的,因此它应当具有汇编 语言所能完成的一些功能。C语言既具有高级语言的 特点,又具有低级语言的功能,因而具有广泛的用途 和很强的生命力。第9章介绍的指针运算和本章将介 绍的位运算就很适合于编写系统软件的需要,是C语 言的重要特色。在计算机用于检测和控制领域中要用 到位运算的知识,因此读者应当学习和掌握本章的内 容。 • 所谓位运算是指进行二进制位的运算。在系统软件中, 常要处理二进位的问题。例如,将一个存储单元中的 各二进位左移或右移一位,两个数按位相加等。C语 言提供位运算的功能,与其他高级语言(如PASCAL) 相比,它显然具有很大的优越性
清华大学出版社 TSINGHUA UNIVERSITY PRESS 12.1位运算符和位运算 12.1.1“按位与”运算符(&) ·参加运算的两个数据,按二进位进行“与”运算。 如果两个相应的二进位都为1,则该位的结果值为 1,否则为0。即 0&0=0;0&1=0;1&0=0;1&1=1; ·例如:3&5并不等于8,应该是按位与。 3=00000011 (&)5=00000101 00000001
12.1.1 “按位与”运算符(&) • 参加运算的两个数据,按二进位进行“与”运算。 如果两个相应的二进位都为1,则该位的结果值为 1,否则为0。即 • 0&0=0;0&1=0;1&0=0;1&1=1; • 例如: 3&5 并不等于8,应该是按位与。 3 = 00000011 (&) 5 = 00000101 00000001 12.1 位运算符和位运算
清华大学出版社 TSINGHUA UNIVERSITY PRESS 因此,3&5的值得1。如果参加&是负数运算的是 负数(如3&5),则以补码形式表示为二进制数, 然后按位进行“与”运算。 按位与有一些特殊的用途: (①)清零。如果想将一个单元清零,即使其全部 二进位为0,只要找一个二进制数,其中各个位 符合以下条件:原来的数中为1的位,新数中相 应位为0。然后使二者进行&运算,即可达到清 零目的。 如:原有数为00101011,另找一个数,设它为 10010100,它符合以上条件,即在原数为1的位 置上,它的位值均为0。将两个数进行&运算:
因此,3&5的值得1。如果参加&是负数运算的是 负数(如-3 & -5),则以补码形式表示为二进制数, 然后按位进行“与”运算。 按位与有一些特殊的用途: (1) 清零。 如果想将一个单元清零,即使其全部 二进位为0,只要找一个二进制数,其中各个位 符合以下条件:原来的数中为1的位,新数中相 应位为0。然后使二者进行&运算,即可达到清 零目的。 如:原有数为00101011,另找一个数,设它为 10010100,它符合以上条件,即在原数为1的位 置上,它的位值均为0。将两个数进行&运算:
清华大学出版社 TSINGHUA UNIVERSITY PRESS 00101011 (&)10010100 00000000 ·其道理是显然的。当然也可以不用10010100这个 数而用其他数(如01000100)也可以,只要符合上述 条件即可。 ·(2)取一个数中某些指定位。如有一个整数a(2个 字节),想要其中的低字节。只需将a与(737)8按位 与即可。见图12.1
00101011 (&) 10010100 00000000 • 其道理是显然的。当然也可以不用10010100这个 数而用其他数(如01000100)也可以,只要符合上述 条件即可。 • (2) 取一个数中某些指定位。如有一个整数a(2个 字节),想要其中的低字节。只需将a与(737)8按位 与即可。见图12.1
清华大学出版社 ● TSINGHUA UNIVERSITY PRESS a 0010 1100 10101100 b 00 000000 11111111 00 0000 00 10101100 图12.1 a 00101100 10101100 b 11111111 00000000 c 00101100 00000000 图12.2
图12.2 图12.1
清华大学出版社 TSINGHUA UNIVERSITY PRESS c=a&b,b为八进制数的377,运算后c只保留a的低字节, 高字节为0。 ·如果想取两个字节中的高字节,只需c=a&0177400 (0177400表示八进制数的177400)。见图12.2。 ·(3)要想将哪一位保留下来,就与一个数进行&运算,此数 在该位取1,如:有一数01010100,想把其中左面第3、4、 5、7、8位保留下来,可以这样运算: 01010100 (十进制数84) ● (&)00111011 (十进制数59) ● 00010000士进制数16) 。即 a=84,b=59,c=a&b=16
• c=a&b,b为八进制数的377,运算后c只保留a的低字节, 高字节为0。 • 如果想取两个字节中的高字节,只需c=a & 0177400 (0177400表示八进制数的177400)。见图12.2。 • (3) 要想将哪一位保留下来,就与一个数进行&运算,此数 在该位取1,如:有一数01010100,想把其中左面第3、4、 5、7、8位保留下来,可以这样运算: • 01010100 (十进制数84) • (&)00111011 (十进制数59) • 00010000(十进制数16) • 即 a=84,b=59,c=a&b=16
清华大学出版社 TSINGHUA UNIVERSITY PRESS 12.1.2按位或运算符0 两个相应的二进位中只要有一个为1,该位的结 果值为1。即010=0; 01=1; 10=1; 11=1。 例如:0601017 将八进制数60与八进制数17进行按位或运算。 00110000 ● ()00001111 00111111 ·低4位全为1。如果想使一个数a的低4位改为1, 只需将a与017进行按位或运算即可。 按位或运算常用来对一个数据的某些位定值为1。 如:a是一个整数(16位),有表达式a0377则低8
12.1.2 按位或运算符(|) • 两个相应的二进位中只要有一个为1,该位的结 果值为1。即0|0=0; 0|1=1; 1|0=1; 1|1=1。 例如:060|017 • 将八进制数60与八进制数17进行按位或运算。 • 00110000 • (|) 00001111 • 00111111 • 低4位全为1。如果想使一个数a的低4位改为1, 只需将a与017进行按位或运算即可。 • 按位或运算常用来对一个数据的某些位定值为1。 如:a是一个整数(16位),有表达式a |0377则低8
清华大学出版社 TSINGHUA UNIVERSITY PRESS 位全置为1。高8位保留原样。 12.1.3 “异或”运算符(个) ·异或运算符个也称XOR运算符。它的规则是若参 加运算的两个二进位同号,则结果为0(假);异号 则为1(真)。即0∧0=0;0个1=1; 1Λ0=1 1个1=0;如 ● 00111001 (十进制数57,八进制数071) ● (∧)00101010 十进制数42,八进制数052) 00010011 十进制数19,八进制数023) 。 即071个052,结果为023(八进制数)
位全置为1。高8位保留原样。 12.1.3 “异或”运算符(∧) • 异或运算符∧也称XOR运算符。它的规则是若参 加运算的两个二进位同号,则结果为0(假);异号 则为1(真)。即0∧0=0; 0∧1=1; 1∧0=1; 1∧1=0;如: • 00111001 (十进制数57,八进制数071) • (∧)00101010 (十进制数42,八进制数052) • 00010011 (十进制数19,八进制数023) • 即071∧052,结果为023(八进制数)
清华大学出版社 TSINGHUA UNIVERSITY PRESS ·“异或”的意思是判断两个相应的位值是否为 “异”,为“异”(值不同)就取真(),否则为假 (0). 下面举例说明个运算符的应用: (1)使特定位翻转 假设有01111010,想使其低4位翻转,即1变 为0,0变为1。可以将它与00001111进行∧运算, 即 01111010 (∧)00001111 01110101
• “异或”的意思是判断两个相应的位值是否为 “异”,为“异”(值不同)就取真(1),否则为假 (0)。 • 下面举例说明∧运算符的应用: • (1) 使特定位翻转 • 假设有01111010,想使其低4位翻转,即1变 为0,0变为1。可以将它与00001111进行∧运算, 即 • 01111010 • (∧)00001111 • 01110101