Upload
bo-mccullough
View
62
Download
5
Embed Size (px)
DESCRIPTION
第 9 章 位运算. 9.1 移位运算符 9.2 按位与、或、异或运算符 9.3 按位取反运算符. 例题链接. 返回. 9.1 移位运算符. P282. 位运算 —— 对二进制位进行的运算 位运算只能对 整型 或 字符型 进行. 高. 低. 左移运算符 (
Citation preview
第第 99 章 位运算章 位运算
9.1 9.1 移位运算符移位运算符
9.2 按位与、或、异或运算符
9.3 按位取反运算符
例题链接
9.1 移位运算符
位运算——对二进制位进行的运算位运算——对二进制位进行的运算 位运算只能对位运算只能对整型整型或或字符型字符型进行 进行
P282P282
返回
运算符 功 能 优先级 结合性
~ 按位取反 从右向左
<< 、 >> 左移、右移 从左向右
& 按位与 从左向右
^ 按位异或 从左向右
| 按位或 从左向右
低
高
左移运算符 左移运算符 (<<)(<<)
将一个操作数的各二进制位全部向左移动指定的位数。左移后,右边空出来的位置补 0,左边移出的位舍去。其一般格式为:操作数 1 <<操作数 2
♣ 其中“操作数 1”是被左移的操作数,“操作数2”是左移的位数。
右移运算符 右移运算符 (>>)(>>)右移运算符 (>>)的一般格式为:
操作数 1>>操作数 2♣ 其中“操作数 1”是被右移的操作数,“操作数 2”是右移的位数。
规则:将一个操作数的各二进制位全部向右移动指定的位数。右移后右边移出去的位舍去。左边的高位填补分两种情况。① 对无符号数,右移时高位补 0。② 对有符号数,如果符号位为 0(即正数),高位补
0;如果符号位为 1(即负数),则高位补 1。这种补 1以保持操作数原来的符号的方法称为“算术右移”,补 0的称为“逻辑右移”。
【例【例 99..11 】移位运算符的示例】移位运算符的示例 #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位
72,4,-5
对负数右移参见 9.4.1节
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
72 ( =a×23
) 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 1 0 00
a
a<<3
a>>1 4 ( =a÷ 21 )
a
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 按位与、或、异或运算符【例【例 9.29.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
P284P284
返回
0 0 0 0 0 1 0 10 0 0 0 1 0 1 10 0 0 0 0 0 0 1
511&
结果为 1
按位与运算 按位与运算
0 0 0 0 0 1 0 10 0 0 0 1 0 1 10 0 0 0 1 1 1 1
511|
结果为 15
按位或运算 按位或运算
0 0 0 0 0 1 0 10 0 0 0 1 0 1 10 0 0 0 1 1 1 0
511^
结果为 14
按位异或运算 按位异或运算
【例【例 9.39.3 】假设字符型变量】假设字符型变量 aa 中存放中存放的内容为的内容为 1100000111000001 (二进(二进制值),完成以下各功能制值),完成以下各功能
将 a 的最高位置成 0 ,其余的位不变与最高位为 0 ,其余位均为 1 的数进行按位与运算即可( a & 127 )
1 1 0 0 0 0 0 10 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 10 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 10 0 0 0 0 0 1 11 1 0 0 0 0 1 1
|
低两位置 1 ,其余不变
将 a 的高四位不变,低四位翻转与低四位为 1 ,高四位为 0 的数进行按位异或运算即可( a ^ 15 )
1 1 0 0 0 0 0 10 0 0 0 1 1 1 11 1 0 0 1 1 1 0
^ 低四位置翻转,高四位不变
【例【例 9.49.4 】假设字符型变量】假设字符型变量 aa 中存放的内容中存放的内容为为 0100000101000001 (二进制值),即为(二进制值),即为字符’字符’ A’A’ ,要求将位上的数字按,要求将位上的数字按11 变为变为 00 ,, 00 变为变为 11 进行翻转 进行翻转
9.3 按位取反运算符( ~ )
0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0
~ 结果为 190 65
对所有位进行翻转
P285P285
返回