第12章 位运算
第10章位运算 本章内容 位运算符和位运算 2.位运算举例 3.位段
-2- 第10章 位运算 本 章 内 容 1. 位运算符和位运算 2. 位运算举例 3. 位段
第10章位运算 基本概念 概念 ◆位运算是指按二进制位进行的运算。因为在系统软件中,常要处 理二进制位的问题。 例如:将一个存储单元中的各二进制位左移或右移一位,两个数 按位相加等。 ◇C语言提供位运算的功能,与其他高级语言(如 PASCAL)相比, 具有很大的优越性
-3- 第10章 位运算 基 本 概 念 概念 v 位运算是指按二进制位进行的运算。因为在系统软件中,常要处 理二进制位的问题。 例如:将一个存储单元中的各二进制位左移或右移一位,两个数 按位相加等。 v C语言提供位运算的功能,与其他高级语言(如PASCAL)相比, 具有很大的优越性
第10章位运算 12.1位运算符和位运算 ■C语言提供的位运算符 运算符含义运算符含义 &按位与 取反 按位或 左移 ∧按位异或> 右移 ■说明: 令位运算符中除~以外,均为二目(元)运算符,即要求两侧各有 个运算量。 ◆运算量只能是整型或字符型的数据,不能为实型数据
-4- 第10章 位运算 12.1 位运算符和位运算 C语言提供的位运算符 v 位运算符中除~以外,均为二目(元)运算符,即要求两侧各有 一个运算量。 v 运算量只能是整型或字符型的数据,不能为实型数据。 运算符 含义 运算符 含义 & 按位与 ~ 取反 | 按位或 > 右移
第10章位运算 12.1位运算符和位运算 ■"按位与″运算符(&) ☆〃按位与″运算规则 如果两个相应的二进制位都为1,则该位的结果值为1;否则为 0。即 0&0=0,0&1=0,1&0=0,1&1=1例:3&5 并不等于8,应该是按位与运算: 0000001(3) 3&5的值得1 &0000101(5) 0000001(1) 注意:如果参加&运算的是负数(如-3&-5),则要以补码形式表 示为二进制数,然后再按位进行"与"运算
-5- 第10章 位运算 12.1 位运算符和位运算 "按位与"运算符(&) v "按位与"运算规则 如果两个相应的二进制位都为1,则该位的结果值为1;否则为 0。即: 0&0=0,0&1=0,1&0=0,1&1=1例:3&5 并不等于8,应该是按位与运算: 注意:如果参加&运算的是负数(如-3&-5),则要以补码形式表 示为二进制数,然后再按位进行"与"运算。 00000011(3) & 00000101(5) 00000001(1) 3&5的值得1
第10章位运算 12.1位运算符和位运算 按位与的用途 ☆清零 使一个存储单元清零,即使其全部二进制位为0。 ■找一个二进制数,符合以下条件:原来的数中为1的位相应 位为0。 ■然后使二者进行&运算即可。 例:原有数为00101011,另找一个数,设它为1001 0100,将这两个数进行&运算 00101011 &10010100 00000000
-6- 第10章 位运算 12.1 位运算符和位运算 按位与的用途 v 清零 使一个存储单元清零,即使其全部二进制位为0。 找一个二进制数,符合以下条件:原来的数中为1的位相应 位为0。 然后使二者进行&运算即可。 例: 原有数为00101011,另找一个数,设它为1001 0100,将这两个数进行&运算: 00101011 & 10010100 00000000
第10章位运算 12.1位运算符和位运算 ☆取一个数中某些指定位 如有一个整数a(2个字节),想要取其中的低字节,只需将 a与255(8个1)按位与即可。 a匚0010110010101100 0000000011111111 0000000010101100 ◇保留一位 与一个数进行&运算,此数在该位取1 例如:有一数01010100,想把其中左面第3、4、5、7、 8位保留下来,运算如下: 01010100(84) &00111011(59) 即:a=84,b=59 00010000(16) c=a&b=16
-7- 第10章 位运算 12.1 位运算符和位运算 v 取一个数中某些指定位 如有一个整数a(2个字节),想要取其中的低字节,只需将 a与255(8个1)按位与即可。 v 保留一位 与一个数进行&运算,此数在该位取1。 例如:有一数01010100,想把其中左面第3、4、5、7、 8位保留下来,运算如下: a 0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0 b c 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 即:a=84,b=59 c=a&b=16 01010100(84) & 00111011(59) 00010000(16)
第10章位运算 12.1位运算符和位运算 "按位或″运算符(|) ◇"按位或″运算规则 两个相应的二进制位中只要有一个为1,该位的结果值为1。 即00=0,01=1,1|0=1,1|1=1 例:060017,将八进制数60与八进制数17进行按位或运算。 00110000 l0001111 00111111 ◆应用 ■按位或运算常用来对一个数据的某些位置值为 例如:如果想使一个数a的低4位改为1,只需将a与01 7进行按位或运算即可。 例:a是一个整数(16位),有表达式: a0377或a|0xff 则低8位全置为1,高8位保留原样
-8- 第10章 位运算 12.1 位运算符和位运算 "按位或"运算符(|) v "按位或"运算规则 两个相应的二进制位中只要有一个为1,该位的结果值为1。 即 0|0=0,0|1=1,1|0=1,1|1=1 例: 060|017,将八进制数60与八进制数17进行按位或运算。 v 应用 按位或运算常用来对一个数据的某些位置值为1。 例如:如果想使一个数a的低4位改为1,只需将a与01 7进行按位或运算即可。 例:a是一个整数(16位),有表达式: a | 0377 或 a | 0xff 则低8位全置为1,高8位保留原样。 00110000 | 00001111 00111111
第10章位运算 12.1位运算符和位运算 ■"异或″运算符(∧) 异或″运算符运算规则 建霸播青介梨管:驾则羞乘嘉算留腰在 相 加:0∧0=0,0∧1=1,1∧0=1,1∧1=0。例: 00111001 ∧00101010 00010011 即:071∧052=023(八进制数) ◆∧运算符应用 ■使特定位翻转 设有01111010,想使 其低4位翻转,即1变为0 01111010 0变为1。可以将它与000 ∧00001111 01111进行∧运算,即: 01110101 要使哪几位翻转就将与其进行∧运算的该几位置为1即可
-9- 第10章 位运算 12.1 位运算符和位运算 "异或"运算符(∧) v "异或"运算符运算规则 异或运算符∧也称XOR运算符。它的规则是:若参加运算的两个二 进制位同号则结果为0(假),异号则结果为1(真)即按位相 加: 0∧0=0, 0∧1=1, 1∧0=1, 1∧1=0。例: 即:071∧052=023 (八进制数) v ∧运算符应用 使特定位翻转 设有01111010,想使 其低4位翻转,即1变为0, 0变为1。可以将它与000 01111进行∧运算,即: 要使哪几位翻转就将与其进行∧运算的该几位置为1即可。 00111001 ∧ 00101010 00010011 01111010 ∧ 00001111 01110101
第10章位运算 12.1位运算符和位运算 ■与0相∧,保留原值 00001010 例如:012∧00=012 ∧0000000 00001010 交换两个值,不用临时变量 例如:a=3,b=4。互换a和b的值: a=a∧b b=b∧a; a=a∧b; a=011 (∧)b=100 a=111(a∧b的结果,a已变成7) (∧)b=100 b=011(b∧a的结果,b已变成3) (∧)a=111 a=100(a∧b的结果,a已变成4) 10
-10- 第10章 位运算 12.1 位运算符和位运算 与0相∧,保留原值 例如:012∧00=012 交换两个值,不用临时变量 例如:a=3,b=4。互换a和b的值: a=a∧b; b=b∧a; a=a∧b; a=011 (∧)b=100 a=111(a∧b的结果,a已变成7) (∧)b=100 b=011(b∧a的结果,b已变成3) (∧)a=111 a=100(a∧b的结果,a已变成4) 00001010 ∧ 00000000 00001010