第八章位运算
第八章 位运算
概述 所谓位运算是指进行二进制位的运算在系统软件中,常要 处理二进位的问题例如将一个存储单元中的各二进位左移 或右移一位,两个数按位相加等 字节和位 大多计算机系统的内存储器是由许多称为“字节”(byte) 的单元组成的每一个字节有一个地址.一个字节由若干个 进制位(bit)组成若干个字节组成一个存储单元称为”字 (word)每一个存储单元存放一个数据或一条指令 个字节一般由8个二进制位组成其中最右边的一位称为 最低有效位”或“最低位”,最左面的一位称为“最高有效 位”或“最高位”每一个二进位的值是0或1 在微型机中一般以4个字节存放一个实数以2个字节存放 个整数最左边的一位(最高位)用作数的符号位 为了表示数值,可以采用不同的方法,般有:原码,反码和补码
概述 所谓位运算是指进行二进制位的运算.在系统软件中,常要 处理二进位的问题.例如,将一个存储单元中的各二进位左移 或右移一位,两个数按位相加等. 一.字节和位 大多计算机系统的内存储器是由许多称为“字节”(byte) 的单元组成的.每一个字节有一个地址.一个字节由若干个二 进制位(bit)组成.若干个字节组成一个存储单元,称为”字 ”(word).每一个存储单元存放一个数据或一条指令. 一个字节一般由8个二进制位组成,其中最右边的一位称为 “最低有效位”或“最低位”,最左面的一位称为“最高有效 位”或“最高位”.每一个二进位的值是0或1. 在微型机中一般以4个字节存放一个实数,以2个字节存放 一个整数.最左边的一位(最高位)用作数的符号位. 为了表示数值,可以采用不同的方法,一般有:原码,反码和补码
位运算符 C语言提供如下表所列出的位运算符: 运算符 含义 & 按位与 按位或 按位异或 取反 左移 右移 说 1位运算符中除~以外均为二目(元)运算符,即要求两侧 各有一个运算符 明 2运算量只能是整型或字符型的数据不能为实型数据
位运算符 运算符 含义 & 按位与 | 按位或 ^ 按位异或 ~ 取反 > 右移 C语言提供如下表所列出的位运算符: 1.位运算符中除~以外,均为二目(元)运算符,即要求两侧 各有一个运算符. 2.运算量只能是整型或字符型的数据,不能为实型数据. 说 明
运算符简介 “按位与”运算符(&) 参加运算的两个运算量,如果有个相应的位都为1,则该位 的结果值为1,否则为0.即 0&0=0;0&1=0;1&0=0;1&1=1; 例如:3&5并不等于8,这是按位与先把3和5以补码表示,再 进行按位与运算 3的补码:0000011 5的补码:000001 &:00000001 它是1的补码因此,3&5的值得1例L8-1
运算符简介 一.“按位与”运算符(&) 参加运算的两个运算量,如果有个相应的位都为1,则该位 的结果值为1,否则为0.即: 0&0=0; 0&1=0; 1&0=0; 1&1=1; 例如: 3&5并不等于8,这是按位与.先把3和5以补码表示,再 进行按位与运算. 3的补码: 00000011 5的补码: 00000101 &: 00000001 它是1的补码.因此,3&5的值得1.——例L8-1
按位与的特殊用途 1清零如果想将一个单元清零,即使其全部二进位为0,只 要找一个数它的补码形式中各位的值符合以下条件原来 的数中为1的位新数中相应位为0然后使二者进行&运算 如:原有数为00101011,另找一个数,设它为10010100,它符 合以上条件,即在原数为1的位置上,它的位值均为0.将两 个数进行&运算 00101011 (43) & 10010100 (148) 00000000 (0) 其道理是显然的,当然也可以不用10010100这个数而用其 它数(如01000100也可以,只要符合上述条件即可 例L8-2
按位与的特殊用途 1.清零.如果想将一个单元清零,即使其全部二进位为0,只 要找一个数,它的补码形式中各位的值符合以下条件:原来 的数中为1的位,新数中相应位为0.然后使二者进行&运算. 如: 原有数为00101011,另找一个数,设它为10010100,它符 合以上条件,即在原数为1的位置上,它的位值均为0.将两 个数进行&运算: 00101011 (43) & 10010100 (148) 00000000 (0) 其道理是显然的,当然也可以不用10010100这个数而用其 它数(如01000100)也可以,只要符合上述条件即可. 例L8-2
2取一个数中某些指定位如一个整数a(2个字节),如只想要 其中的低字节只需将a与(377)按位与即可见下图 a00101100 1010110011436 b|00000000 1111111255 00000000 10101100172 c=a&bb为八进制的377c只取a的低字节高字节为0 如果想取两个字节中的高字节只需c=a&0177400(0177400表 示八进制的177400)见下图 a00101100 1010110011436 b 11 111111 0000000065280 00101100 0000000011264 例L8-3
2.取一个数中某些指定位.如一个整数a(2个字节),如只想要 其中的低字节.只需将a与(377)8按位与即可.见下图: 00 10 11 00 10 10 11 00 00 00 00 00 11 11 11 11 00 00 00 00 10 10 11 00 a b c c=a&b,b为八进制的377,c只取a的低字节,高字节为0. 如果想取两个字节中的高字节,只需:c=a&0177400 (0177400表 示八进制的177400).见下图: 00 10 11 00 10 10 11 00 11 11 11 11 00 00 00 00 00 10 11 00 00 00 00 00 a b c 例L8-3 11436 255 172 11436 11264 65280
3要想将哪一位保留下来,就与一个数进行&运算,此数在 该位取1,如:有一数oIo0100,想把其第2,34位保留下来, 可以这样 01010100 (十进制数84) (&)000110 (十进制数28) 00010100 (十进制数20) 即:a=84,b=28,c=a&b=20 例L8-4
3.要想将哪一位保留下来,就与一个数进行&运算,此数在 该位取1,如: 有一数 01 0101 00,想把其第2,3,4位保留下来, 可以这样 01010100 (十进制数84) (&) 00011100 (十进制数28) 00010100 (十进制数20) 即: a =84, b=28, c=a & b=20 例L8-4
二按位或运算符(|) 两个相应位中只要有一个为1,该位的结果值为1即 0|0=0;0|1=1;1|0=1;1|1=1 例如:0601017 将八进制数60与八进制数17进行按位或运算 00110000 (|)0000111l 00111111 (63) 例L8-5 把低4位全置1如果想使一个数a的低4位改为1只需将a与 017进行按位或运算即可 按位或运算常用来对一个数据的某些位定值为1如:a是 个整数(16位),有表达式a|0377 则低8位全置为1高8位保留原样
二.按位或运算符( | ) 两个相应位中只要有一个为1,该位的结果值为1.即: 0 | 0=0; 0 | 1=1; 1 | 0=1; 1 | 1=1. 例如: 060 | 017 将八进制数60与八进制数17进行按位或运算. 00110000 ( | ) 00001111 0011 1111 (63)10 例L8-5 把低4位全置1.如果想使一个数a的低4位改为1,只需将a与 017进行按位或运算即可. 按位或运算常用来对一个数据的某些位定值为1.如: a是 一个整数(16位),有表达式 a | 0377 则低8位全置为1.高8位保留原样
三“异或”运算符(^)也称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(八进制数).例L8-6 异或”的意思是判断两个相应的位值是否为“异”,为 “异”(值不同)就取真(1),否则为假(0)
三.“异或”运算符( ^ ),也称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(八进制数). 例L8-6 “异或”的意思是:判断两个相应的位值是否为“异”,为 “异”(值不同)就取真(1),否则为假(0)
四“取反”运算符( 是一个单目(元)运算符,用来对一个二进制数按位取反,即 将0变1,1变0.例如 025是对八进制数25(即二进制数0000001)按位求反 0000000000010101 1111l01010 即八进制数177752因此,~025的值为八进制数177752不要以为 025的值是-025 运算符的应用
四.“取反”运算符( ~ ) ~是一个单目(元)运算符,用来对一个二进制数按位取反,即 将0变1,1变0.例如: ~025是对八进制数25(即二进制数0000000000010101)按位求反. 0000000000010101 1111111111101010 即八进制数177752.因此,~025的值为八进制数177752.不要以为 ~025的值是-025. ~运算符的应用: