20
9 9 第 第第第 第 第第第 9.1 9.1 移移移移移 移移移移移 9.2 移移移 移移 移移移移移 、、 9.3 移移移移移移移 第第第第

第 9 章 位运算

Embed Size (px)

DESCRIPTION

第 9 章 位运算. 9.1 移位运算符 9.2 按位与、或、异或运算符 9.3 按位取反运算符. 例题链接. 返回. 9.1 移位运算符. P282. 位运算 —— 对二进制位进行的运算 位运算只能对 整型 或 字符型 进行. 高. 低. 左移运算符  (

Citation preview

Page 1: 第 9 章 位运算

第第 99 章 位运算章 位运算

9.1 9.1 移位运算符移位运算符

9.2 按位与、或、异或运算符

9.3 按位取反运算符

例题链接

Page 2: 第 9 章 位运算

9.1 移位运算符

位运算——对二进制位进行的运算位运算——对二进制位进行的运算 位运算只能对位运算只能对整型整型或或字符型字符型进行 进行

P282P282

返回

Page 3: 第 9 章 位运算

运算符 功 能 优先级 结合性

~ 按位取反 从右向左

<< 、 >> 左移、右移 从左向右

& 按位与 从左向右

^ 按位异或 从左向右

| 按位或 从左向右

Page 4: 第 9 章 位运算

左移运算符 左移运算符  (<<)(<<)

将一个操作数的各二进制位全部向左移动指定的位数。左移后,右边空出来的位置补 0,左边移出的位舍去。其一般格式为:操作数 1 <<操作数 2

♣ 其中“操作数 1”是被左移的操作数,“操作数2”是左移的位数。

Page 5: 第 9 章 位运算

右移运算符 右移运算符 (>>)(>>)右移运算符 (>>)的一般格式为:

操作数 1>>操作数 2♣ 其中“操作数 1”是被右移的操作数,“操作数 2”是右移的位数。

规则:将一个操作数的各二进制位全部向右移动指定的位数。右移后右边移出去的位舍去。左边的高位填补分两种情况。① 对无符号数,右移时高位补 0。② 对有符号数,如果符号位为 0(即正数),高位补

0;如果符号位为 1(即负数),则高位补 1。这种补 1以保持操作数原来的符号的方法称为“算术右移”,补 0的称为“逻辑右移”。

Page 6: 第 9 章 位运算

【例【例 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节

Page 7: 第 9 章 位运算

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

Page 8: 第 9 章 位运算

9.2 按位与、或、异或运算符

1. 按位与运算符 (&) 运算符“ &” 要求参加运算的两个操作数的各个

位分别对应,按二进制位进行“与”运算。按“位与”的一般格式为:    操作数 1 & 操作数 2   其中“操作数 1”和“操作数 2”均为整型数据。

规则:如果两个操作数对应的二进制位都为 1,则该位的运算结果为 1,否则为 0。即,

1&1=1 ;    1&0=0 ;    0&1=0 ;    0&0=0 ; 

Page 9: 第 9 章 位运算

9.2 按位与、或、异或运算符2. 按位或运算符( | ) 

运算符“ |” 要求参加运算的两个操作数的各个位分别对应,按二进制位进行“或”运算。 

按按“位或”的一般格式为:    操作数 1 | 操作数 2♣ 其中“操作数 1”和“操作数 2”均为整型操作数。

   如果两个操作数对应的二进制位中只要有一个为 1,则该位的运算结果为 1,否则为 0。即,

1|1=1 ;    1|0=1 ;    0|1=1 ;    0|0=0 ;   

Page 10: 第 9 章 位运算

9.2 按位与、或、异或运算符3. 按位异或运算符( ^ ) 

运算符“ ^”要求参加运算的两个操作数的各个位分别对应,按二进制位进行“异或”运算。

规则:两个操作数对应的二进制位相同,则该位的运算结果为 0,对应位不同,则该位结果为 1。即,

♣ 0^0=0 ;  0^1=1 ;  1^0=1 ;  1^1=0 ;

Page 11: 第 9 章 位运算

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

返回

Page 12: 第 9 章 位运算

0 0 0 0 0 1 0 10 0 0 0 1 0 1 10 0 0 0 0 0 0 1

511&

结果为 1

按位与运算 按位与运算

Page 13: 第 9 章 位运算

0 0 0 0 0 1 0 10 0 0 0 1 0 1 10 0 0 0 1 1 1 1

511|

结果为 15

按位或运算 按位或运算

Page 14: 第 9 章 位运算

0 0 0 0 0 1 0 10 0 0 0 1 0 1 10 0 0 0 1 1 1 0

511^

结果为 14

按位异或运算 按位异或运算

Page 15: 第 9 章 位运算

【例【例 9.39.3 】假设字符型变量】假设字符型变量 aa 中存放中存放的内容为的内容为 1100000111000001 (二进(二进制值),完成以下各功能制值),完成以下各功能

Page 16: 第 9 章 位运算

  将 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 ,其余不变

Page 17: 第 9 章 位运算

  将 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

Page 18: 第 9 章 位运算

将 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 ,其余不变

Page 19: 第 9 章 位运算

将 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

^ 低四位置翻转,高四位不变

Page 20: 第 9 章 位运算

【例【例 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

返回