- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf ( “ %d , %d ” , a , b ) ;
}
第 输出: 4 , 3
十
一 章
结论
利用异或运算,不必设置第三个 变量就可以实现两个变量值的交换。
重点
四川理工学院
C 5. << (左移位运算)
语 言 程 序 设 计
作用: 将操作数的各个二进位顺序左移。右端空出的
a >> 4 & ~ ( ~ 0 << 4 )
第
十
一 章
15
8 7
4
0
四川理工学院
C
语 言 程 序 设 计
void main ( ) { unsigned a , b , c , d ; scanf (“ %o” , &a ) ; b = a >> 4 ; c = ~ ( ~ 0 << 4 ) ; d=b&c; printf ( “ %o\n %o\n ” , a , d ) ; }
077 00000000 00111111 main ( ) ~ 077 11111111 11000000 { int x ; scanf( “ %d ” , &x ) ; x&= ~ 077 ; printf ( “ x= % o \n”, x ) ; } 如输入: 256 输出为: x = 400 ( 8 进制 ) 同样,如将x的后 6位全置1 , 则只需将x = x | 077 即可。
位补0 , 而移出左端之外的位则舍去。 如: a << n 表示将 a 的各个二进位顺序左移 n 说明:
第
十
一 章
(1) 左移运算相当于乘 2 运算。 对无符号数, 位( n 为正整数)。 左移 1 位相当于乘 2 左移 n 位 ,则乘 2n 例如: a = 25 则 a << 3 结果为 200 (2) 对于用补码表示的正数,如果左移出的全部 是0 ,且移出后的最高位仍是 0 。 a (3) 对于用补码表示的负数,如果左移出的全部 00000000 00011001 是1 ,且移出后的最高位仍是 1 。 a << 3 00000000 11001000 (4) 若非上述情况 ( 如:左移出现溢出时), 就不 能简单地用乘 2 来计算。 如: 有符号字符型数 64 , 当它左移2 位时,结果为 0 。 说明:
a
00000000 11011001
C 例11.3 将一个整数 a 循环右移 n 位。 所谓循环右移
语 是将 a 最右端的位顺序移到 a 的最左端,而将 a 中原 言 左端的各位顺序右移到最右端。 程 序 设 1 0 0 0 1 0 0 1 右移 2 位 计 0 1 1 0 0 0 1 0
}
第 如输入: 157653 , 3 十 输出为: 157653 一 章
75765 同样可以实现循环左移。
11011111 10101011
01111011 11110101
四川理工学院
C
语 言 程 序 设 计
作业
P308 12.1 12.2 12.3
第
十
一 章
四川理工学院
章
四川理工学院
C
语 例如: a = 32768 言 程 a 10000000 00000000 序 设 a >>1 01000000 00000000 逻辑右移, 结果为 16384 计 a >>1 11000000 00000000 算术右移, 结果为 16384
实例
注意事项
四川理工学院
C
语 言 程 序 设 计
2. & (按位与运算)
作用: 对参加运算的两个二进制数逐位进行逻辑
与运算, 规则: 实例 如: a&b 0&0 = 0, 1&0 = 0 , 0&1 = 0, 1&1 = 1
第
十
一 章
main( ) 例如:int a = 5 ,, b = 2 ,, 则:; a & b = 0 a = 1 b = 12 d { d = a&b ; a 00000000 00000001 printf (“%d&%d = %d\n”, a, b, d ); b 11111111 11111110 } 输出: a&b 00000000 00000000 5&12 = 4
结论
第
十
一 章
任意指定从右端 m 位 开始, 如输入: 331 n 00000000 00001101 输出为: 331 取其右面的 d 位。 15 只需: b = a >> ( m – n + 1 ) c= 结论 ~ ( ~ 0 << n ) d=b&c 四川理工学院
第
十
一 章
算术右移运算相当于除 2 运算。右移 1 位 相当于除 2。 右移 n 位 ,则除 2n 。
四川理工学院
C 二、优先级
第 一 章
语 1. 位运算符的优先级 言 >> 程 ~ & ^ | 序 高 << 低 设 结合性: ~ 运算按从右至左 , 其余按从左至右。 计 例: x & ~ 077 x & ( ~ 077) x >> 2 & y << 3 ( x >> 2 )& (y << 3 )
第
十
一 章
四川理工学院
C
例11.2 取一整数 a 从右端开始的 4 ~ 7 位。 语 言 (1) 先使 a 右移 4 位 a >> ( 7 – 4 + 1 ) 即 a >> 4 程 序 (2) 设置一个低 4位全为 1,其余位全为 0 的数。 ~ ( ~ 0 << 4 ) 设 计 (3) 将二者进行 & 运算
第
十
一 章
a
00000000 00001111 00000000 00000000
b
a ^ b 00000000 00001111 四川理工学院
C
语 言 程 序 设 计
例 : main ( )
{ int a = 3 , b = 4 ;
a=a^b; b=b^a; a=a^b;
第 一 章
(3) 将 c 与 b 按位或运算 c=c|b
c
00011011 01111011
11110101 11110101c Nhomakorabea十
四川理工学院
void C main ( )
语 { unsignde a , b , c ; int n ; scanf ( “ %o , %d ” , &a , &n ) ; 言 b = a << ( 16 – n ) ; 程 c = a >> n ; 序 c=c|b ; 设 printf ( “ %o \n %o \n” , a , c ) ; 计
unsigned 。
第
位运算符共 6 种:
& | ^ ~ << >>
十
一 章
四川理工学院
C 1. ~ (按位取反运算符)
语 言 程 序 设 计
实例
作用: 对一个二进制数逐位取反
第
十
一 章
实例11.1 如: a = 15 则 ~ a main ( ) { int a = 0 , b = 1 ; printf ( “ %d , %d \n”, ~a ,~b ) ; 重点 printf ( “ %d , %d \n”, !a , !b ) ; a 00000000 00001111 printf 注意: ~, 运算和 ! 运算的区别。 ( “ %d %d \n”, a , b ) ; }运行结果: ~ 2 1, 的优先级与 ++ , , !同级, ~ a 11111111 11110000 结合性从右至左。 1, 0 0, 1
第
十
一 章
四川理工学院
C 将 a 左移 16 – n 位并存入变量 b 中,这样 b 中最左端 (1)
语 的 n 位就是原 a 最右端的 n 位, 而 b 中最右端 言 (16 – n )位全为 0 。 a 11011111 10101011 程 b = a << ( 16 – n ) b 01100000 00000000 序 (2) 设 将 a 右移 n 位 ,其左端高 n 位补 0 。 计 c = a >> n
实例
四川理工学院
C
3. | (按位或运算)
语 作用: 对参加运算的两个二进制数逐位进行逻辑 言 或运算 程 如: a|b 序 设 规则: 0|0=0,1|0=1,0|1=1,1|1=1 计 例如: a = 1 , b = 1 , 则: a | b = 1。
第
a
b a|b
十
四川理工学院
C
语 言 程 序 设 计
2. 复合赋值运算 & = , | = , ^ = , << = , >> = 如: a & = b a=a&b a << = m + 1 a = a << m + 1
第
十
一 章
四川理工学院
C
序 设 计
三、位运算的应用 例11.1 将整数 x 的后 6 位全置 0 ,其余位不变。 语 取 y = 0177700 或 y = ~ 077 ( 八进制数 ) 言 则 x & y 即满足要求。 程