第十二章位运算
合集下载
C12位运算

12.1.4 ~ (按位取反)
对一个二进制数按位取反 ( 0 → 1 1 → 0 ),如 :
~ 00011001
11100110
例如 : 若一个整数 a 为16 位,要使 a 最低一位为 0。 a= a & 0177776 ; (常量与 a 的字长有关 )
最好的用法是以下表达式:(与 a 的字长无关)
(2) 设置一个右端4位全为1其余全为 0的数: ~(~0<<4) --- ~0=111111….11 , ~0<<4=1111….10000 , c = ~( ~0<<4)=0000….1111
(3) 将上述两个数进行 & 运算: d=b& c ;
a
15
87
43
0
b
15
43 0
程序如下:
void main( ) {
01110101
2. 用 0去与某些位异或 , 保留原值。 上例中前 4 位用 0去异或,保留原值 0111
3. 交换两个值 , 不用临时变量。 例如 : a=a ^ b ; b=b ^ a ; b=b ^ (a ^ b) =b ^ a ^ b =a ^ b ^ b=a a=a ^ b ; a=(a ^ b) ^ a =a ^ b ^ a=b ^ a ^ a=b
第十二章 位运算
第十二章 位运算
在计算机控制领域中常用到位运算。这是C语言的重要特色 。
12 . 1 位运算符和位运算
位运算-----二进制位的运算 (只能是整型和字符型数据,不能为实型数据)。
运算符
含义
& | ^
~(一目运算符)
<<
>>
《补充二位运算》PPT课件

a=1
例
main()
{short int a,b;
a=-1;
b=5;
ffff
printf("%hx\n",a>>1);
ffff
printf("%hx\n",a>>2);
2
printf("%hx\n",b>>1);
1
printf("%hx\n",b>>2);
}
6.位运算符赋值运算符 &=,|=,>>=,<<=,^=
第十二章位运算
1、位运算符的含义
位运算是指进行二进制位的运算。
2、功能:
c语言提供对内存单元的二进制位的操作, 使得c语言能够编写系统软件.
3、位运算符
&: 按位与
|: 按位或
^: 按位异或
~ : 取反
<<: 左移
>>: 右移
要点: 1.位运算除~以外,均为二目运算; 2.运算对象只能为整型或字符型数据.
1.按位与运算 0&0=0 1&0=0
00110110 & 00001111
00000110
0&1=0 1&1=1
与0做与运算结果为0 与1做与运算结果为原值
2.按位或运算 0|0=0 0|1=1 如:
1|0=1 1|1=1 10101101 00001111 10101111
与0做或运算结果为原值 与1做或运算结果为1
ffff
printf("%hx\n",a|b);
ffff 0
printf("%hx\n",a^b);
例
main()
{short int a,b;
a=-1;
b=5;
ffff
printf("%hx\n",a>>1);
ffff
printf("%hx\n",a>>2);
2
printf("%hx\n",b>>1);
1
printf("%hx\n",b>>2);
}
6.位运算符赋值运算符 &=,|=,>>=,<<=,^=
第十二章位运算
1、位运算符的含义
位运算是指进行二进制位的运算。
2、功能:
c语言提供对内存单元的二进制位的操作, 使得c语言能够编写系统软件.
3、位运算符
&: 按位与
|: 按位或
^: 按位异或
~ : 取反
<<: 左移
>>: 右移
要点: 1.位运算除~以外,均为二目运算; 2.运算对象只能为整型或字符型数据.
1.按位与运算 0&0=0 1&0=0
00110110 & 00001111
00000110
0&1=0 1&1=1
与0做与运算结果为0 与1做与运算结果为原值
2.按位或运算 0|0=0 0|1=1 如:
1|0=1 1|1=1 10101101 00001111 10101111
与0做或运算结果为原值 与1做或运算结果为1
ffff
printf("%hx\n",a|b);
ffff 0
printf("%hx\n",a^b);
位运算

2.按位或──|
(1)格式:x | y (2)规则:对应位均为0时才为0,否则为1。 例如,15|9=15: 0000 0000 0000 1111 | 0000 0000 0000 1001 0000 0000 0000 1111=15 (3)主要用途: 将1个数的某(些)位置1,其余各位不变。
12.3 应用举例
[例12.1] 从键盘上输入1个正整数给int变量num,输出由8~ 11位构成的数(从低位、0号开始编号)。 基本思路: (1)使变量num右移8位,将8~11位移到低4位上。 (2)构造1个低4位为1、其余各位为0的整数。 (3)与num进行按位与运算。
main() { int num, mask; printf("Input a integer number: "); scanf("%d",&num); num >>= 8; /*右移8位,将8~11位移到低4位上*/ mask = ~ ( ~0 << 4); /*间接构造1个低4位为1、其余各位为0的整数*/ printf("result=0x%x\n", num & mask); }
3.按位异或──^
(1)格式:x ^ y (2)规则:对应位相同时为0,不同时为1:15^9=6。 0000 0000 0000 1111 ^ 0000 0000 0000 1001 0000 0000 0000 0110=6 (3)主要用途: 使一个数的某(些)位翻转(即原来为1的位变为0,为0的 变为1),其余各位不变。
种情况: (1)正数的反码:与原码相同。 例如,+9的反码是00000000 00001001。 (2)负数的反码:符号位为1,其余各位为该数绝对 值的原码按位取反(1变0、0变1)。 例如:-9的原码 10000000 00001001 按位取反为 11111111 11110110 -9的反码是 11111111 11110110 16位二进制的整数,其反码的数值范围为: 10000000 00000000 ~ 11111111 11111111(-32767~ -0) 00000000 00000000 ~ 01111111 11111111(+0~ +32767)
C语言新教材PPT课堂课件第12章位运算

| 1001 ────
1011=11 (3)主要用途:将1个数的某(些)位置1,其余各位不变。
3.按位异或── ^ (1)格式:x^y (2)规则:对应位相同时为0,不同时为1:3^9=10。 例如,3^9=1: 0011
^ 1001
────
1010=10 (3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0 的变为1),其余各位不变。 4.按位取反── ~ (1)格式:~x (2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1: 在IBM-PC机中,~0=0xffff,~9=0xfff6。 (3)主要用途:间接地构造一个数,以增强程序的可移植性。 5.按位左移── << (1)格式:x<< 位数 (2)规则:使操作数的各位左移,低位补0,高位溢出:5<<2=20。
程序运行情况:
Input a integer number:1000 ←┘
result=0x3
程序说明:~ ( ~0 << 4)按位取0的反,为全1;左移4位后,其低4位为0,其 余各位为1;再按位取反,则其低4位为1,其余各位为0。这个整数正是我们 所需要的。
[例12.2] 从键盘上输入1个正整数给int变量num,按二进制位输 出该数。
printf("Input a integer number: ");
scanf("%d",&num);
num >>= 8;
/*右移8位,将8~15位移到低8位上*/
mask = ~ ( ~0 << 4);/*间接构造1个低4位为1、其余各位为0的整数*/
printf("result=0x%x\n", num & mask); }
1011=11 (3)主要用途:将1个数的某(些)位置1,其余各位不变。
3.按位异或── ^ (1)格式:x^y (2)规则:对应位相同时为0,不同时为1:3^9=10。 例如,3^9=1: 0011
^ 1001
────
1010=10 (3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0 的变为1),其余各位不变。 4.按位取反── ~ (1)格式:~x (2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1: 在IBM-PC机中,~0=0xffff,~9=0xfff6。 (3)主要用途:间接地构造一个数,以增强程序的可移植性。 5.按位左移── << (1)格式:x<< 位数 (2)规则:使操作数的各位左移,低位补0,高位溢出:5<<2=20。
程序运行情况:
Input a integer number:1000 ←┘
result=0x3
程序说明:~ ( ~0 << 4)按位取0的反,为全1;左移4位后,其低4位为0,其 余各位为1;再按位取反,则其低4位为1,其余各位为0。这个整数正是我们 所需要的。
[例12.2] 从键盘上输入1个正整数给int变量num,按二进制位输 出该数。
printf("Input a integer number: ");
scanf("%d",&num);
num >>= 8;
/*右移8位,将8~15位移到低8位上*/
mask = ~ ( ~0 << 4);/*间接构造1个低4位为1、其余各位为0的整数*/
printf("result=0x%x\n", num & mask); }
第12章 位运算

在进行“左移”运算时,如果移出去的高位部分不包含1, 则左移1位相当于乘以2,左移2位相当于乘以4,左移3位相当 于乘以8,依此类推。因此在实际应用中,经常利用“左移” 运算来进行乘以2倍的操作。 【例12.2】输入两个短整数存入a、b中,并由a 、b两个数 生成新的数c,其生成规则是:将a的低字节作为c的高字节, 将b的低字节作为c的低字节,并显示出来。 #include “stdio.h” void main() { int a,b,c; printf(“请输入两个短整型数:”); scanf(“%d%d”,&a,&b); c=(a&0x00ff)<<8|(b&0x00ff); printf(“新生产的数:%d\n”,c); }
四.“按位取反”运算符~ “按位取反”的运算规则是:将运算对象中的各位的值 取反,即将1变为0,将0变为1。 “按位取反”运算符是单目运算符,用~表示。 “按位取反”可能的运算组合及其运算结果。 例如:若x=0x3b,则~x的计算结果如下所示: ~) 00111011 (x的二进制数) 11000100 (0xc4) 即:~x=0xc4 。
12.2
移位运算
一、 左移运算符<< “左移”的运算规则是:将运算对象中的每个二进制位向左 移动若干位,从左边移出去的高位部分被丢弃,右边空出的低 位部分补零。 左移运算符用<<表示。 例如:若x=0x17,则语句:x=x<<2 表示将x中的每个二进制位左移2位后存入x中。由于0x17 的二进制表示为00010111,所以左移2位后,将变为: 01011100,即x=x<<2的结果为0x5c。 其中语句:x=x<<2 可以写成:x<<=2;
第12章 位运算

2012年4月22日5时28分 1
第 12章 位运算
~运算常用于产生一些特殊的数。 运算常用于产生一些特殊的数。 xFF00 00, 如高 8 位全 1 低 8 位全 0 的数 0xFF00, 按位取 00FF FF。 位的系统中, 反后变为 0x00FF 。 ~ 1, 在 16 位与 32 位的系统中 , 的整数。 都代表只有最低位为 0 的整数。 运算是位运算中唯一的单目运算, ~运算是位运算中唯一的单目运算, 也是唯一具有右结 合性的位运算。 合性的位运算。
第 12章 位运算
12.1 位逻辑运算
按位取反运算 1. 按位取反运算 运算符: 运算符: ~ 按位取反运算用来对一个二进制数按位取反, 按位取反运算用来对一个二进制数按位取反, 即 0 位变 1, 1 位变 0。 例如: ~25, 25的二进制表示为: ~ 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1111111111100110 即 -26。 。
(2)a | 0xFFFF, a的每一位全置 1。 a的每一位全置 (2)a
2012年4月22日5时28分
5
第 12章 位运算
按位异或运算 4. 按位异或运算 运算符: 运算符: ^ 操作数的对应位相同, 操作数的对应位相同, 则该位的运算结果为 0, 否则为 1。 例如: 29^ 的二进制表示为: 例如: 0x29^0x37 , 0x29 与 0x37 的二进制表示为: 0000000000101001与0000000000110111 0000000000101001与0000000000110111 按位异或结果为: 按位异或结果为: 0000000000011110, 0000000000011110, 即等于 0x1e。 利用^运算将数的特定位翻转, 保留原值, 利用^运算将数的特定位翻转, 保留原值, 不用临时变 量交换两个变量的值。 量交换两个变量的值。
第 12章 位运算
~运算常用于产生一些特殊的数。 运算常用于产生一些特殊的数。 xFF00 00, 如高 8 位全 1 低 8 位全 0 的数 0xFF00, 按位取 00FF FF。 位的系统中, 反后变为 0x00FF 。 ~ 1, 在 16 位与 32 位的系统中 , 的整数。 都代表只有最低位为 0 的整数。 运算是位运算中唯一的单目运算, ~运算是位运算中唯一的单目运算, 也是唯一具有右结 合性的位运算。 合性的位运算。
第 12章 位运算
12.1 位逻辑运算
按位取反运算 1. 按位取反运算 运算符: 运算符: ~ 按位取反运算用来对一个二进制数按位取反, 按位取反运算用来对一个二进制数按位取反, 即 0 位变 1, 1 位变 0。 例如: ~25, 25的二进制表示为: ~ 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1111111111100110 即 -26。 。
(2)a | 0xFFFF, a的每一位全置 1。 a的每一位全置 (2)a
2012年4月22日5时28分
5
第 12章 位运算
按位异或运算 4. 按位异或运算 运算符: 运算符: ^ 操作数的对应位相同, 操作数的对应位相同, 则该位的运算结果为 0, 否则为 1。 例如: 29^ 的二进制表示为: 例如: 0x29^0x37 , 0x29 与 0x37 的二进制表示为: 0000000000101001与0000000000110111 0000000000101001与0000000000110111 按位异或结果为: 按位异或结果为: 0000000000011110, 0000000000011110, 即等于 0x1e。 利用^运算将数的特定位翻转, 保留原值, 利用^运算将数的特定位翻转, 保留原值, 不用临时变 量交换两个变量的值。 量交换两个变量的值。
第12章位运算2

《C程序设计》
第12章 位 运 算
12.1.2 “按位或”运算符(|)
例如:
060|017=?
|
【例12.2 】 #include <stdio.h> void main() {
int a = 060, b=017, or; or = a|b; printf( "%o\n", or ); }
00 11 00 00 (060) 00 00 11 11 (017) 00 11 11 11 (077)
第12章 位 运 算
12.1 位运算符和位运算
概念
位运算是指按二进制位进行的运算。因为在系 统软件中,常要处理二进制位的问题。
例如: ➢ 将一个存储单元中的各二进制位左移或右移。
《C程序设计》
第12章 位 运 算
12.1 位运算符和位运算
C语言提供的位运算符有:
运算符 & | ^
含义 按位与 按位或 按位异或
《C程序设计》
第12章 位 运 算
12.1.1 “按位与”运算符(&)
例如:
3&5 = ?
&
【例12.1 】 #include <stdio.h> void main() {
int a = 3, b = 5, and; and = a&b; printf( "%d\n", and ); getch(); }
#include <stdio.h> void main() {
unsigned int a, b, c; int n; scanf( "%o%d", &a, &n ); b = a<<(16-n); c = a>>n; c = c|b; printf( "%o\n%o", a, c ); }
第12章 位 运 算
12.1.2 “按位或”运算符(|)
例如:
060|017=?
|
【例12.2 】 #include <stdio.h> void main() {
int a = 060, b=017, or; or = a|b; printf( "%o\n", or ); }
00 11 00 00 (060) 00 00 11 11 (017) 00 11 11 11 (077)
第12章 位 运 算
12.1 位运算符和位运算
概念
位运算是指按二进制位进行的运算。因为在系 统软件中,常要处理二进制位的问题。
例如: ➢ 将一个存储单元中的各二进制位左移或右移。
《C程序设计》
第12章 位 运 算
12.1 位运算符和位运算
C语言提供的位运算符有:
运算符 & | ^
含义 按位与 按位或 按位异或
《C程序设计》
第12章 位 运 算
12.1.1 “按位与”运算符(&)
例如:
3&5 = ?
&
【例12.1 】 #include <stdio.h> void main() {
int a = 3, b = 5, and; and = a&b; printf( "%d\n", and ); getch(); }
#include <stdio.h> void main() {
unsigned int a, b, c; int n; scanf( "%o%d", &a, &n ); b = a<<(16-n); c = a>>n; c = c|b; printf( "%o\n%o", a, c ); }
《新概念C语言能力教程》第12章位运算

• 分析:用异或操作改变某位的状态以控制相关灯的明灭,使用左移操作构造 操作数。
例12-3 把一个整数32位中的高16位和低16位互换。
12.3 位段
• C语言允许在一个结构型中以位为单位指定其成员实际存储空间的长度,结 构型中指定了存储长度的成员就是所谓的位段。
• 结构型struct bitfield虽然有三个内部成员a,b,c,但它们存储空间的长度只有 2位、4位和2位。内部成员a、b、c虽然位数不多,但仍为int型,有符号数 ,即a和c的取值范围为-2至1,b的取值范围为-8至7。
• 位段的类型只能为整型(有符号,无符号及字符型)
12.1.3 异或操作符^
• 异或操作符^也称xor操作符。异或操作符^将参与运算的两个操作数以二进制 位为单位进行“异或”运算。
• “异或”运算可理解为“判断是否不同(为异)”的运算。异或运算时,如 果两个二进制位上的数相同,则运算结果的此位为0(表示否,不为异); 如果两个二进制位上的数不同,则运算结果的此位为1(表示是,为异)。
12.1.6 右移操作符>>
• 右移操作符与左移操作符类似,表达式a >> n求值时,会将a的二进制位全 部右移n位,右端移出的n位被舍弃。根据左端移入数的不同,右移操作分为 “逻辑右移”和“算术右移”两种。
• 逻辑右移时,无论a为何类型,左端均移入n个0; • 算术右移时,如果a为非负数,则左端移入n个0;如果a为负数,则左端移入
• 左移操作符<<的常用形式为:a << n • 其中,a和n均为整数,求值时a的二进制位全部左移n位,右端补n个0,舍
弃左端移出的n位。显然n的取值范围通常为1至sizeof(a) * 8。 • 在位运算中,左移操作符常用于构造操作数。 • 无符号字符型变量c的值为165,需点亮第6号灯,可以用如下表达式c |= 1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12.1.6 右移运算符(>>)
右移运算符是a>>2表示将a的各二进制位 右移2位,移到右端的低位被舍弃,对无符号 数,高位补0。 例如:a=017时:
a的值用二进制形式表示为00001111 , 舍弃低2位11: a>>2=00000011
右移一位相当于除以2 右移n位相当于除以2n。
在右移时,需要注意符号位问题: 对无符号数,右移时左边高位移入0;对于有
a=a∧b;
b=b∧a;
a=011
a=a∧b; (∧)b=100
a=111(a∧b的结果,a已变成7)
(∧)b=100
b=011(b∧a的结果,b已变成3)
(∧)a=111
a=100(a∧b的结果,a已变成4)
即等效于以下两步:
① 执行前两个赋值语句:“a=a∧b;”和“b =b∧a;”相当于b=b∧(a∧b)。
② 再执行第三个赋值语句: a=a∧b。由于a的 值等于(a∧b),b的值等于(b∧a∧b), 因此,相当于a=a∧b∧b∧a∧b,即a的值等 于a∧a∧b∧b∧b,等于b。 a得到b原来的值。
12.1.4 “取反”运算符(~)
~是一个单目(元)运算符,用来对一个二进制 数按位取反,即将0变1,将1变0。例如,~ 025是对八进制数25(即二进制数0001 0101)按位求反。
运算结果的低4位正好 是原数低4位的翻转。可 见,要使哪几位翻转就将 ∧ 与其进行∧运算的该几位 置为1即可。
(2) 与0相∧,保留原值 例如:012∧00=012
∧
因为原数中的1与0进行∧运算得1, 0∧0得0,故保留原数。
(3) 交换两个值,不用临时变量
例如:a=3,b=4。
想将a和b的值互换,可以用以下赋值语句实现:
12.1 位运算符和位运算
C语言提供的位运算符有:
运算符 含义
& 按位与 | 按位或 ∧ 按位异或
运算符
~ 取反 << 左移 >> 右移
含义
说明:
(1)位运算符中除~以外,均为二目(元)运算符, 即要求两侧各有一个运算量。
(2)运算量只能是整型或字符型的数据,不能为实型 数据。
12.1.1“按位与”运算符(&)
应位值均为0。将这两个数
进行&运算:
(2) 取一个数中某些指定位。 如有一个整数a(2个字节),想要取其中
的低字节,只需将a与8个1按位与即可。
a 00101100 1010110 0 b 00000000 1111111 1 c 00000000 1010110 0
(3)保留一位的方法:与一个数进行&运算, 此数在该位取1。
例: 060|017,将八进制数60与八进制数17进行 按位或运算。
|
应用:按位或运算常用来对一个数据的某 些位定值为1。例如:如果想使一个数a 的低4位改为1,只需将a与017进行 按位或运算即可。
例: a是一个整数(16位), 有表达式:a | 0377 则低8位全置为1,高8位保留原样。
12.1.3“异或”运算符(∧)
按位与的用途:
(1) 清零。
若想对一个存储单元清零,即使其全部二进制位为 0,只要找一个二进制数,其中各个位符合以下条 件:原来的数中为1的位,新数中相应位为0。然 后使二者进行&运算,即可达到清零目的。
例: 原有数为0010101
1,另找一个数,设它为1 0010100,这样在原&数为1的位置上,该数的相
高位左移后溢出,舍弃。
12.1.5 左移运算符(<<)
左移1位相当于该数乘以2,左移2位相 当于该数乘以22=4,15<<2=60,即乘了 4。但此结论只适用于该数左移时被溢出舍 弃的高位中不包含1的情况。
假设以一个字节(8位)存一个整数,若 a为无符号整型变量,则a=64时,左移 一位时溢出的是0,而左移2位时,溢出的 高位中包含1。
符号的值,如果原来符号位为0(该数为正),则左 边也是移入0。如果符号位原来为1(即负数), 则左边移入0还是1,要取决于所用的计算机系 统。有的系统移入0,有的系统移入1。移入0 的称为“逻辑右移”,即简单右移;移入1的称 为“算术右移”。
例: a的值是八进制数113755:
a:11101 (用二进制形式表示) a>>1: 10110 (逻辑右移时) a>>1: 11110 (算术右移时)
按位与是指:参加运算的两个数据,按二进制位进行 “与”运算。如果两个相应的二进制位都为1,则 该位的结果值为1;否则为0。即:
0&0=0,0&1=0,1&0=0,1&1=1
例:3&5并不等于8,应该是按位与运算:
(3) & (5)
(1)
3&5的值得1
注意:如果参加&运算的是 负数(如-3&-5),则要以 补码形式表示为二进制数 ,然后再按位进行“与” 运算。
10101 (~)
1111111111101010 (八进制数177752)
12.1.5 左移运算符(<<)
左移运算符是用来将一个数的各二进制位 全部左移若干位。
例如:a=<<2 将a的二进制数左移2位,右补0
。 若a=15,即二进制数00001111, 左移2位得00111100,(十进制数60)
例:有一数01010100,想把其中左面第 3、4、5、7、8位保留下来,运算如下:
(84) & (59)
(16)
即:a=84,b=59 c=a&b=16
12.1.2 “按位或”运算符(|)
两个相应的二进制位中只要有一个为1,该位的 结果值为1。 即 0|0=0,0|1=1,1|0=1,1|1=1
第十二章位运算
本章学习目标
理解位的概念; 理解位运算的含义; 能够用位运算符进行相应的位操作; 了解位段的概念和使用。
概念
位运算是指按二进制位进行的运算。因为在 系统软件中,常要处理二进制位的问题。 例如:将一个存储单元中的各二进制位左移 或右移一位,两个数按位相加等。 C语言提供位运算的功能,与其他高级语言 (如PASCAL)相比,具有很大的优越性。
异或运算符∧也称XOR运算符。它的规则是: 若参加运算的两个二进制位同号则结果为0(假)
异号则结果为1(真)
即:0∧0=0,0∧1=1,1∧0=1, 1∧1=0 例:
∧
即:071∧052=023 (八进制数)
∧运算符应用:
(1) 使特定位翻转
设有01111010,想使其低4位翻 转,即1变为0,0变为1。可以将它与0 0001111进行∧运算,即: