200 likes | 349 Views
第 9 章 位运算. 9.1 移位运算符 9.2 按位与、或、异或运算符 9.3 按位取反运算符. 例题链接. 返回. 9.1 移位运算符. P282. 位运算 —— 对二进制位进行的运算 位运算只能对 整型 或 字符型 进行. 高. 低. 左移运算符 (<<). 将一个操作数的各二进制位全部向左移动指定的位数。左移后,右边空出来的位置补 0 ,左边移出的位舍去。其一般格式为: 操作数 1 << 操作数 2 其中“操作数 1” 是被左移的操作数,“操作数 2” 是左移的位数。. 右移运算符 (>>).
E N D
第9章 位运算 9.1 移位运算符 9.2 按位与、或、异或运算符 9.3 按位取反运算符 例题链接
返回 9.1 移位运算符 P282 • 位运算——对二进制位进行的运算 • 位运算只能对整型或字符型进行
高 低
左移运算符 (<<) • 将一个操作数的各二进制位全部向左移动指定的位数。左移后,右边空出来的位置补0,左边移出的位舍去。其一般格式为: • 操作数1 <<操作数2 • 其中“操作数1”是被左移的操作数,“操作数2”是左移的位数。
右移运算符 (>>) • 右移运算符(>>)的一般格式为: • 操作数1>>操作数2 • 其中“操作数1”是被右移的操作数,“操作数2”是右移的位数。 • 规则:将一个操作数的各二进制位全部向右移动指定的位数。右移后右边移出去的位舍去。左边的高位填补分两种情况。 ① 对无符号数,右移时高位补0。 ② 对有符号数,如果符号位为0(即正数),高位补0;如果符号位为1(即负数),则高位补1。这种补1以保持操作数原来的符号的方法称为“算术右移”,补0的称为“逻辑右移”。
【例9.1】移位运算符的示例 #include <stdio.h> main( ) { int a=9,b=-9,x=0,y=0,z=0; x=a<<3; y=a>>1; z=b>>1; printf("%d,%d,%d\n",x,y,z); } 左移3位 右移1位 对负数右移参见9.4.1节 72,4,-5
a 0 0 0 a<<3 72(=a×23) a 0 a>>1 4(=a÷ 21)
9.2 按位与、或、异或运算符 1. 按位与运算符 (&) • 运算符“&”要求参加运算的两个操作数的各个位分别对应,按二进制位进行“与”运算。 • 按“位与”的一般格式为: 操作数1 &操作数2 其中“操作数1”和“操作数2”均为整型数据。 • 规则:如果两个操作数对应的二进制位都为1,则该位的运算结果为1,否则为0。即, 1&1=1 ; 1&0=0 ; 0&1=0 ; 0&0=0 ;
9.2 按位与、或、异或运算符 2.按位或运算符(|) • 运算符“|”要求参加运算的两个操作数的各个位分别对应,按二进制位进行“或”运算。 • 按按“位或”的一般格式为: 操作数1 | 操作数2 • 其中“操作数1”和“操作数2”均为整型操作数。 • 如果两个操作数对应的二进制位中只要有一个为1,则该位的运算结果为1,否则为0。即, 1|1=1 ; 1|0=1 ; 0|1=1 ; 0|0=0 ;
9.2 按位与、或、异或运算符 3.按位异或运算符(^) • 运算符“^”要求参加运算的两个操作数的各个位分别对应,按二进制位进行“异或”运算。 • 规则:两个操作数对应的二进制位相同,则该位的运算结果为0,对应位不同,则该位结果为1。即, • 0^0=0 ; 0^1=1 ; 1^0=1 ; 1^1=0 ;
返回 9.2 按位与、或、异或运算符 P284 【例9.2】示例 #include <stdio.h> main( ) { char a=5,b=11,x=0,y=0,z=0; x = a & b; y = a | b; z = a ^ b; printf("%d,%d,%d\n",x,y,z); } 按位与 按位或 按位异或 1,15,14
按位与运算 0 0 0 0 0 1 0 1 5 0 0 0 0 1 0 1 1 11 & 0 0 0 0 0 0 0 1 结果为1
按位或运算 0 0 0 0 0 1 0 1 5 | 0 0 0 0 1 0 1 1 11 0 0 0 0 1 1 1 1 结果为15
0 0 0 0 0 1 0 1 按位异或运算 5 0 0 0 0 1 0 1 1 11 ^ 0 0 0 0 1 1 1 0 结果为14
【例9.3】假设字符型变量a中存放的内容为11000001(二进制值),完成以下各功能【例9.3】假设字符型变量a中存放的内容为11000001(二进制值),完成以下各功能
将a的最高位置成0,其余的位不变 与最高位为0,其余位均为1的数进行按位与运算即可(a & 127) 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 & 0 1 0 0 0 0 0 1 最高位置0,其余不变
将a的各位置成0 与各位均为0的数进行按位与运算即可(a & 0) 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 & 0 0 0 0 0 0 0 0 各位变为0
将a的低两位置1,其余的位不变 与低两位为1,其余位均为0的数进行按位或运算即可(a | 3) 1 1 0 0 0 0 0 1 | 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 低两位置1,其余不变
将a的高四位不变,低四位翻转 与低四位为1,高四位为0的数进行按位异或运算即可(a ^ 15) 1 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 ^ 1 1 0 0 1 1 1 0 低四位置翻转,高四位不变
返回 9.3 按位取反运算符(~) P285 【例9.4】假设字符型变量a中存放的内容为01000001(二进制值),即为字符’A’,要求将位上的数字按1变为0,0变为1进行翻转 0 1 0 0 0 0 0 1 ~ 65 1 0 1 1 1 1 1 0 结果为190 对所有位进行翻转