C语言程序设计案例教程课件 第十二章 位的运算
合集下载
C语言课件第12章 位运算
1.
位运算规则: 位运算规则: A 0 0 1 1 B 0 1 0 1 A&B 0 0 0 1 A|B 0 1 1 1 A^B 0 1 1 0 ~a 1 1 0 0
例12.1 若 a=(15)10=(00001111)2, a=(15) b=(80)10=(01010000)10 则: a&b = 0000 0000, a|b = 0101 1111, a^b =01011111 , ~a = 1111 0000
/*设 a 为待处理的数据,转换成二进制为00001000, /*设 为待处理的数据,转换成二进制为00001000, b用来保存将a的高4位清0后的结果*/ 用来保存将a的高4位清0后的结果* main() { unsigned char a,b,c; a=8; b=a&0x0f; c=b|0xa0; /*c用于保存最终结果*/ b=a&0x0f; c=b|0xa0; /*c用于保存最终结果 用于保存最终结果* printf("%x" printf("%x",c); }
4)左移,右移运算实现将一个数的各个二进制位向左,向 4)左移,右移运算实现将一个数的各个二进制位向左,向 右移若干位. 左移:将一个数的各个二进制位左移若干位,高位左移 左移:将一个数的各个二进制位左移若干位, 后舍弃,低位补0 后舍弃,低位补0 . 若定义: 若定义: int a=8; 即a= 0000 1000 0010 0000 0000 右移:将一个数的各个二进制位右移若个位,低位右移 右移:将一个数的各个二进制位右移若个位, 后舍弃, 还是补1 后舍弃,高位补 0还是补1,要区别有符号数还是无符号 无符号数高位补0 有符号数高位补原符号位. 数:无符号数高位补0,有符号数高位补原符号位. 若定义 unsigned int a=8; 即 00001000, a=8; 00001000, 则语句 a=a>>2 ;将 a 的各二进制位右移 2 位,空出的 高位补 0.结果为: 0000 0010 , 则语句a=a<<2; 则语句a=a<<2;
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); }
c程序设计语言第十二章
C语言程序设计
位运算
2.按位或运算符(|) .按位或运算符( )
按位或运算符“ 是双目运算符 是双目运算符。 按位或运算符“|”是双目运算符。其功能是参与运算的两数 各对应的二进位相或。只要对应的两个二进位有一个为1时 各对应的二进位相或。只要对应的两个二进位有一个为 时,结 果位就为1。 果位就为 。 即: 0|0=0; 0|1=1; 1|0=1; 1|1=1 | | | | 例如: | 可写算式如下 可写算式如下: 例如:9|5可写算式如下: 00001001 (9的二进制补码 的二进制补码) 的二进制补码 (|)00000101 (5的二进制补码 的二进制补码) | 的二进制补码 —————————— 00001101 (1的二进制补码 的二进制补码) 的二进制补码 可见9|5=13。 可见 。 按位或运算常用来对一个数据的某些位定值为1。 按位或运算常用来对一个数据的某些位定值为 。
C语言程序设计
位运算
1.按位与运算符(&) .按位与运算符( )
按位与运算符“&”是双目运算符。其功能是参与运算的两 按位与运算符“ 是双目运算符。 是双目运算符 数各对应的二进位相与。只有对应的两个二进位均为1时,结果位 数各对应的二进位相与。只有对应的两个二进位均为 时 才为1,否则为0。参与运算的数以补码方式出现。 才为 ,否则为 。参与运算的数以补码方式出现。 即: 0&0=0; 0&1=0; 1&0=0; 1&1=1 例如: 可写算式如下: 例如:9&5可写算式如下: 可写算式如下 00001001 &00000101 00000001 可见9&5=1。 。 可见 (9的二进制补码 的二进制补码) 的二进制补码 (5的二进制补码 的二进制补码) 的二进制补码 (1的二进制补码 的二进制补码) 的二进制补码
C语言程序设计课件位运算
示例二
使用位异或运算可以检测一个整数的奇偶性。例如,将一 个整数与1进行位异或运算,如果结果为1,则该整数为奇 数;如果结果为0,则该整数为偶数。
示例三
使用位异或运算可以实现快速取模运算。例如,将一个整 数与一个常数进行位异或运算,可以得到该整数除以该常 数的余数。
06 位非运算
位非运算的定义
• 位非运算是一种位运算操作,它对一个二进制数的每一位进行取反操作。如果某一位是1,则位非运算后变为0;如果某一 位是0,则位非运算后变为1。
部分数组交换等。
THANKS FOR WATCHING
感谢您的观看
右移位运算
总结词
将二进制位向右移动若干位。
详细描述
右移位运算符(>>)将一个数的二进制位向右移动若干位,左侧空出的位用符号位填充。对于有符号整数,右 侧空出的位用符号位填充;对于无符号整数,右侧空出的位用0填充。右移位运算实质上是将该数除以2的若干次 方。
无符号右移位运算
总结词
将二进制位向右移动若干位,左侧空出的位用0填充。
C语言程序设计课件位运算
目录
• 位运算概述 • 移位运算 • 位与运算 • 位或运算 • 位异或运算 • 位非运算
01 位运算概述
位运算的定义
01
位运算是一种以二进制位为对象 的运算方式,通过对二进制位进 行操作来执行特定的功能。
02
在C语言中,位运算符包括按位与 (&)、按位或(|)、按位异或(^)、 按位取反(~)、左移(<<)和右移 (>>)。
位非运算的规则
位非运算的规则是将一个二进制数的 每一位都进行取反操作。具体来说, 如果某一位是1,则位非运算后变为0; 如果某一位是0,则位非运算后变为1。
使用位异或运算可以检测一个整数的奇偶性。例如,将一 个整数与1进行位异或运算,如果结果为1,则该整数为奇 数;如果结果为0,则该整数为偶数。
示例三
使用位异或运算可以实现快速取模运算。例如,将一个整 数与一个常数进行位异或运算,可以得到该整数除以该常 数的余数。
06 位非运算
位非运算的定义
• 位非运算是一种位运算操作,它对一个二进制数的每一位进行取反操作。如果某一位是1,则位非运算后变为0;如果某一 位是0,则位非运算后变为1。
部分数组交换等。
THANKS FOR WATCHING
感谢您的观看
右移位运算
总结词
将二进制位向右移动若干位。
详细描述
右移位运算符(>>)将一个数的二进制位向右移动若干位,左侧空出的位用符号位填充。对于有符号整数,右 侧空出的位用符号位填充;对于无符号整数,右侧空出的位用0填充。右移位运算实质上是将该数除以2的若干次 方。
无符号右移位运算
总结词
将二进制位向右移动若干位,左侧空出的位用0填充。
C语言程序设计课件位运算
目录
• 位运算概述 • 移位运算 • 位与运算 • 位或运算 • 位异或运算 • 位非运算
01 位运算概述
位运算的定义
01
位运算是一种以二进制位为对象 的运算方式,通过对二进制位进 行操作来执行特定的功能。
02
在C语言中,位运算符包括按位与 (&)、按位或(|)、按位异或(^)、 按位取反(~)、左移(<<)和右移 (>>)。
位非运算的规则
位非运算的规则是将一个二进制数的 每一位都进行取反操作。具体来说, 如果某一位是1,则位非运算后变为0; 如果某一位是0,则位非运算后变为1。
C语言程序设计电子课件——位运算
{ b=b<<1 ; b=(a & (1<<i))>>i | b ;
} printf("%o\n" , b) ; }
【例12-12】 取一个单元a的某几位到另一个单元b。 程序如下:
# include <stdio.h> void yiwei(pa , pb , st1 , st2 , n1) unsigned *pa , *pb ; int st1 , st2 , n1 ; {
运算符 ~ << >> & ^ |
表12-1 位运算符
名称
使用格式
按位取反
~ 表达式
左移位
表达式1 << 表达式2
右移位
表达式1 >> 表达式2
按位与
表达式1 & 表达式2
按位异或
表达式1 ^ 表达式2
按位或
表达式1 | 表达式2
按位操作的情况,见表12-2,其中a和b分别 表示一个二进制位。
表12-2 按位逻辑运算
a
b
~a a&b a^b a|b
0
0
1
0
0
0
0
1
1
0
1
1
1
0
0
0
1
1
1
1
0
1
0
1
12.1.1 按位取反 按位取反运算符就是将其操作对象中的所有二
进制位全部改变状态,即“逢0变1,逢1变0”。 12.1.2 移位
移位运算符有左移运算符和右移运算符。
1. 左移运算符 左移运算符是将其操作对象向左移动指定的位数, 每左移1位相当于乘以2数据的各位倒序输出。 程序如下:
} printf("%o\n" , b) ; }
【例12-12】 取一个单元a的某几位到另一个单元b。 程序如下:
# include <stdio.h> void yiwei(pa , pb , st1 , st2 , n1) unsigned *pa , *pb ; int st1 , st2 , n1 ; {
运算符 ~ << >> & ^ |
表12-1 位运算符
名称
使用格式
按位取反
~ 表达式
左移位
表达式1 << 表达式2
右移位
表达式1 >> 表达式2
按位与
表达式1 & 表达式2
按位异或
表达式1 ^ 表达式2
按位或
表达式1 | 表达式2
按位操作的情况,见表12-2,其中a和b分别 表示一个二进制位。
表12-2 按位逻辑运算
a
b
~a a&b a^b a|b
0
0
1
0
0
0
0
1
1
0
1
1
1
0
0
0
1
1
1
1
0
1
0
1
12.1.1 按位取反 按位取反运算符就是将其操作对象中的所有二
进制位全部改变状态,即“逢0变1,逢1变0”。 12.1.2 移位
移位运算符有左移运算符和右移运算符。
1. 左移运算符 左移运算符是将其操作对象向左移动指定的位数, 每左移1位相当于乘以2数据的各位倒序输出。 程序如下:
清华浩强C语言课件教学PPT第12章 位运算
法:
• data=data & 0177417 • 0177417的二进制表示为
•
scanf("a=%o,n=%d",&a,&n);
•
b=a<<(16-n);
•
c=a>>n;
•
c=c|b;
•
printf("%o\n%o",a,c);
•
}
• 运行情况如下:
• a=157653,n=3
•0
157653
•
75765
• 运行开始时输入八进制数157653,即二进制数 1101111110101011,循环右移3位后得二进制数 0111101111110101,即八进制数75765。同样可 以左循环位移。
00000110
左 移 1位 后
a=a<<1; 则: a=12
int a=6;
a=a<<2; 则: a=24
00001100
再 左 移 1位 后
00011000
12.1.7 位运算赋值运算符
位运算符与赋值运算符可以组成复合赋值运 算符如:&=, |=, >>=, <<=, ∧=
例如,a & = b相当于 a = a & b。a << =2相当 于:a = a << 2。
• 取出的那几位移到最右端。
图12.3
• 右移到右端可以用下面方法实现: • a >> 4 • ② 设置一个低4位全为1,其余全为0的数。可用下
面方法实现: • ~ ( ~ 0 << 4 ) • ~0的全部二进制为全1,左移4位,这样右端低4
• data=data & 0177417 • 0177417的二进制表示为
•
scanf("a=%o,n=%d",&a,&n);
•
b=a<<(16-n);
•
c=a>>n;
•
c=c|b;
•
printf("%o\n%o",a,c);
•
}
• 运行情况如下:
• a=157653,n=3
•0
157653
•
75765
• 运行开始时输入八进制数157653,即二进制数 1101111110101011,循环右移3位后得二进制数 0111101111110101,即八进制数75765。同样可 以左循环位移。
00000110
左 移 1位 后
a=a<<1; 则: a=12
int a=6;
a=a<<2; 则: a=24
00001100
再 左 移 1位 后
00011000
12.1.7 位运算赋值运算符
位运算符与赋值运算符可以组成复合赋值运 算符如:&=, |=, >>=, <<=, ∧=
例如,a & = b相当于 a = a & b。a << =2相当 于:a = a << 2。
• 取出的那几位移到最右端。
图12.3
• 右移到右端可以用下面方法实现: • a >> 4 • ② 设置一个低4位全为1,其余全为0的数。可用下
面方法实现: • ~ ( ~ 0 << 4 ) • ~0的全部二进制为全1,左移4位,这样右端低4
C语言课件 第十二章 位运算
程序如下: 程序如下: main( ) a, {unsigned a,b,c; n; int n; scanf("a=%o,n=%d",&a,&n); scanf("a=%o,n=%d",&a,&n); b=a<<(16-n); <<(16 b=a<<(16-n); c=a>>n; c=a>>n >> c=c|b; c=c|b; printf("%o\n%o", c); printf("%o\n%o",a,c); }
可以用下面介绍的位段结构体的方法。 位段 C语言允许在一个结构体中以位为单位 来指定其成员所占内存长度,这种以 位为单位的成员称为“位段”或称 “位域” ( bit field) 。利用位段 能够用较少的位数存储数据。
例如: 例如: packedstruct packed-data a∶2; {unsigned a∶2; b∶6; unsigned b∶6; c∶4; unsigned c∶4; d∶4; unsigned d∶4; int i; }data; }data; 见图12.6 其中a 12.6。 分别占2 见图12.6。其中a、b、c、d分别占2位、6 为整型。共占4个字节。 位、4位、4位。i为整型。共占4个字节。
此二 位舍 弃
右移一位相当于除以2,右移n位相当于除以2n。 在右移时,需要注意符号位问题。 对无符号数,右移时左边高位移入0。 对于有符号的值,如果原来符号位为0(该数为正), 则左边也是移入0。 如果符号位原来为1(即负数),则左边移入0还是1, 要取决于所用的计算机系统。有的系统移入0,有 的移入1。移入0的称为“逻辑右移”,即简单右 移。移入1的称为“算术右移”。
c语言第12章位运算PPT课件
000101 00 = 20 36 <<10 :0000,0000,0010,0100
1001,00 00,0000,0000 = - 28672
16.09.2020
17
-100 <<10 :0000,0000,10 01, 1100 0111, 00 00,0000,0000 = + 28672
3
2、数值的原码表示
将最高位用作符号位(0-正数,1-负数),其余各位 代表数值本身的绝对值(以二进制形式表示)的表示形式。
为简化描述起见,本节约定用1个字节表示1个整数。
例如,+9的原码是0
表示正数
-9的原码是1 0001001。
16.09.2020
表示负数
4
3、数值的反码表示 (1)正数的反码:与原码相同。 例如,+9的反码是0 0001001。 (2)负数的反码:符号位为1;其余各位,为该数 绝对值的原码,按位取反(1变0、0变1)。 例如,-9的反码: ①符号位 :1 ②其余7位:|-9|的原码 = 0001001
思考:在不溢出情况下,左移1位,意味着什么?
[返回]
16.09.2020
18
11.2 .6 位右移( >> ) 1. 格式:x >> 位数 2. 规则:使操作数的各位右移,移出的低位舍弃; 高位: ①对无符号数和正数,补0; ②有符号数中的负数,取决于所使用的系统: ● 补0:称为“逻辑右移” ● 补1:称为“算术右移”
按位取反 = 1110110 ③-9的反码= 1
16.09.2020
5
4、数值的补码表示 (1)正数的补码:与原码相同。 (2)负数的补码:符号位为1;其余位为该数绝对值 的原码,按位取反,再加1。 例如,求-9的补码: ①符号位:1 ②其余7位:|-9|的原码 = 0001001
1001,00 00,0000,0000 = - 28672
16.09.2020
17
-100 <<10 :0000,0000,10 01, 1100 0111, 00 00,0000,0000 = + 28672
3
2、数值的原码表示
将最高位用作符号位(0-正数,1-负数),其余各位 代表数值本身的绝对值(以二进制形式表示)的表示形式。
为简化描述起见,本节约定用1个字节表示1个整数。
例如,+9的原码是0
表示正数
-9的原码是1 0001001。
16.09.2020
表示负数
4
3、数值的反码表示 (1)正数的反码:与原码相同。 例如,+9的反码是0 0001001。 (2)负数的反码:符号位为1;其余各位,为该数 绝对值的原码,按位取反(1变0、0变1)。 例如,-9的反码: ①符号位 :1 ②其余7位:|-9|的原码 = 0001001
思考:在不溢出情况下,左移1位,意味着什么?
[返回]
16.09.2020
18
11.2 .6 位右移( >> ) 1. 格式:x >> 位数 2. 规则:使操作数的各位右移,移出的低位舍弃; 高位: ①对无符号数和正数,补0; ②有符号数中的负数,取决于所使用的系统: ● 补0:称为“逻辑右移” ● 补1:称为“算术右移”
按位取反 = 1110110 ③-9的反码= 1
16.09.2020
5
4、数值的补码表示 (1)正数的补码:与原码相同。 (2)负数的补码:符号位为1;其余位为该数绝对值 的原码,按位取反,再加1。 例如,求-9的补码: ①符号位:1 ②其余7位:|-9|的原码 = 0001001
大学课件C语言第十二章位运算
00 00 00 01 00 11 00 10
printf(“%d”,c);
>> 右移位 (算术移位)
1 01 10 01 0 10 1 1 1 01 0 0 0 0 10 1
2024/7/18
位段(位域)
struct bitseg { unsigned a: 2 ; unsigned b: 4 ; unsigned c: 6 ; unsigned d: 4 ; } bits1 , bits2 ;
~ 取反
~ 00000101
char c=5;
11111010
printf (“%d”, ~c); /*考虑补码*/
2024/7/18
位可&运构=、算成|具符如=2、种有和下>字移赋复>=位位值合、移的运赋<<位特算值=、运点符运∧算结算=符合符
<< 左移位(逻辑移位) char c=5;c=c<<2;
利用位运算实现大小写字母的转换
编程思路:大小写字母的ASCII码的差值为 32=25=(100000)2,即 ‘A’ +32= ‘a’, ‘A’: 01000001 ‘a’ : 01100001 它们的差别在右起第 6 位,在大写字母的该
位上置 1 即变为对应的小写字母,在小写字母的 该位上置 0 则变为相应的大写字母。
#include<stdio.h> main()
注:0xdf=(df)16=(11011111)2
{ int i; char c [ 80];
printf(″input a string\n ″); scanf(″%s ″,c);
for (i=0;i<80;i++)
全国计算机二级C语言课件 第12章 位运算
答案:C 4、变量 a 中的数据用二进制进表示的形式是 01011101,变量 b 中 的数据用二进制表示 的形式是11110000,若要求将a 的高4 位取反,低4 位不变,所要执 行的运算是( )。 A)a^b B)ab C)a&b D)a<<4 答案:A
4.位运算符的优先级 (1)位反(~)运算符为单目运算符,优 于所有的双目运算符和三目运算符。 (2)位移位运算符优先级相同,比算术运 算符的优先级低,比关系运算符的优先级高。 (3)位逻辑运算符的优先级比关系运算符 的优先级低,比逻辑运算符的优先级高。 (4)3个位逻辑运算符的优先次序为:& 优 于 ^ 优于 |。 (5)位自反值运算符和赋值运算符、算术 自反值运算符是同级的。
第12章 位运算
本章要点:
12.1 位运算符 12.2 位运算符的运算功能
12.1 位运算符
1.数在计算机中的存放形式
(1)字和字节 (2)原码 (3)补码
2.位运算符 所谓位运算是指进行二进制位的运算。 C语言提供了六种位运算符
表12.1 C语言中的位运算符
运算符 & | ^ ~ << >> 名称 按位与 按位或 按位异或 按位取反 左移 右移 示例 a&b a|b a^b ~a a<<2 a>>3 示例说明 a和b位与 a和b位或 a和b位异或 求a的位反 a左移2位 a右移3位 优先次序 从左向右 从左向右 从左向右 从右向左 从左向右 从左向右
考题讲解
1、
答案:A 2、若有以下程序段 int r=8; printf("%d\n",r>>1); 输出结果是( )。 A)16 B)8 C)4 D)2 答案:C
4.位运算符的优先级 (1)位反(~)运算符为单目运算符,优 于所有的双目运算符和三目运算符。 (2)位移位运算符优先级相同,比算术运 算符的优先级低,比关系运算符的优先级高。 (3)位逻辑运算符的优先级比关系运算符 的优先级低,比逻辑运算符的优先级高。 (4)3个位逻辑运算符的优先次序为:& 优 于 ^ 优于 |。 (5)位自反值运算符和赋值运算符、算术 自反值运算符是同级的。
第12章 位运算
本章要点:
12.1 位运算符 12.2 位运算符的运算功能
12.1 位运算符
1.数在计算机中的存放形式
(1)字和字节 (2)原码 (3)补码
2.位运算符 所谓位运算是指进行二进制位的运算。 C语言提供了六种位运算符
表12.1 C语言中的位运算符
运算符 & | ^ ~ << >> 名称 按位与 按位或 按位异或 按位取反 左移 右移 示例 a&b a|b a^b ~a a<<2 a>>3 示例说明 a和b位与 a和b位或 a和b位异或 求a的位反 a左移2位 a右移3位 优先次序 从左向右 从左向右 从左向右 从右向左 从左向右 从左向右
考题讲解
1、
答案:A 2、若有以下程序段 int r=8; printf("%d\n",r>>1); 输出结果是( )。 A)16 B)8 C)4 D)2 答案:C
C程序设计第十二章
§12.2 位运算和位运算符
一、位运算的概念
位运算:以二进制位为单位的运算。 位运算:以二进制位为单位的运算。 “位运算”仅 限于整数(整型数和字符型)。 位运算” 限于整数(整型数和字符型)。 位运算
二、位运算符
位逻辑运算符( 、 、 、 位逻辑运算符(~、&、^、| ) 位移位运算符( 、 ) 位移位运算符(<<、>>) 位复合赋值运算符( 位复合赋值运算符 &=、|=、^=、<<=、>>=) 、 、 、 、 )
第十二章 位运算
• • •
掌握位运算的概念和方法, 掌握位运算的概念和方法,学会使用位运 算符; 算符; 学会通过位运算实现对某些位的操作; 学会通过位运算实现对某些位的操作; 了解位段的概念以及位段的定义和引用。 了解位段的概念以及位段的定义和引用。
§12.1 相关概念
1. 位(bit):是指二进制中的位,它是计算机能 :是指二进制中的位, 处理的最小单位。 处理的最小单位。 2. 字节 字节(byte):是计算机处理的基本单位。计算 :是计算机处理的基本单位。 机的内存是按字节进行分配的。 机的内存是按字节进行分配的。一个字 节有八位二进制数组成。所以我们在C语 节有八位二进制数组成。所以我们在 语 言中数据类型都是以字节为基本单元。 言中数据类型都是以字节为基本单元。 3. 补码:一个正数的补码是其本身;一个负数的 补码:一个正数的补码是其本身; 补码是其绝对值按位取反后加1。 补码是其绝对值按位取反后加 。计算 机是以补码的形式存放数的。 机是以补码的形式存放数的。 例如: 例如:-7 的补码是 1111 1111 1111 1001
§12.3 位段
• 解决的问题:存放某些信息不需要一个字节,如 解决的问题:存放某些信息不需要一个字节, 真假值只需要一个二进制位即可; 真假值只需要一个二进制位即可; • 解决方法: 解决方法: – 利用位运算程序处理:设置 利用位运算程序处理:设置a,b,c,d分别占 ,6, 分别占2, , 分别占 4,4位 从而实现a,b,c,d共享两个字节 4,4位,从而实现a,b,c,d共享两个字节data; 共享两个字节data; 但是操作非常麻烦; 但是操作非常麻烦; – 例如将 设置为 例如将c设置为 设置为12=(1100)2,需要进行 需要进行data = ( ) 需要进行 data&~(15<<4) | (12<<4) – 如需要取出 部分的值,需要 如需要取出c部分的值 需要(data >> 4) & 15 部分的值,
《C语言程序设计》电子教案 第 12 章 位 运 算 与 文 件
各 位 置 为 0。 • 2. 按 位 或 ( | ) • ①格 式 : x | y。 • ②规 则 : 对 应 位 均 为 0 时 才 为 0, 否 则 为 1。 • ③主 要 用 途 : 将 1 个 数 的 某 ( 些 ) 位 置 1, 其 余 各 位 不
变。
下一页 返回
12. 1 位 运 算 及 其 运 算 符
第 12 章 位 运 算 与 文 件
• 12. 1 位 运 算 及 其 运 算 符 • 12. 2 文 件
返回
12. 1 位 运 算 及 其 运 算 符
• 所谓位运算,是指按二进制位进行的运算。 • 1. 按 位 与 ( &) • ①格 式 : x&y。 • ②规 则 : 对 应 位 均 为 1 时 才 为 1, 否 则 为 0。 • ③主 要 用 途 : 取 ( 或 保 留 ) 1 个 数 的 某 ( 些 )位 , 其 余
一 个 文 件 , 每 个 文 件 都 必 须 有 一 个文 件 名 , 其 一 般 结 构 为:
• 主文件名[.扩展名] • 2. 文 件 分 类 • 可以从不同的角度对文件进行分类: • ①根 据 文 件 的 内 容 , 可 分 为 程 序 文 件 和 数 据 文 件 , 程 序
文 件 又 可 分 为 源 文 件 、 目 标 文 件和 可 执 行 文 件 。
• 4. 构 成 文 件 的 基 本 单 元 与 流 式 文 件
• C 语 言 将 文 件 看 作 由 一 个 一 个 的 字 符 ( ASCII 码 文 件 ) 或 字 节 ( 二 进 制 文 件 ) 组 成 的 。这 种 文 件 称 为 流 式 文件。而在其他高级语言中,组成文件的基本单位是 记 录 , 对 文 件 操 作 的基 本 单 位 也 是 记 录 。
变。
下一页 返回
12. 1 位 运 算 及 其 运 算 符
第 12 章 位 运 算 与 文 件
• 12. 1 位 运 算 及 其 运 算 符 • 12. 2 文 件
返回
12. 1 位 运 算 及 其 运 算 符
• 所谓位运算,是指按二进制位进行的运算。 • 1. 按 位 与 ( &) • ①格 式 : x&y。 • ②规 则 : 对 应 位 均 为 1 时 才 为 1, 否 则 为 0。 • ③主 要 用 途 : 取 ( 或 保 留 ) 1 个 数 的 某 ( 些 )位 , 其 余
一 个 文 件 , 每 个 文 件 都 必 须 有 一 个文 件 名 , 其 一 般 结 构 为:
• 主文件名[.扩展名] • 2. 文 件 分 类 • 可以从不同的角度对文件进行分类: • ①根 据 文 件 的 内 容 , 可 分 为 程 序 文 件 和 数 据 文 件 , 程 序
文 件 又 可 分 为 源 文 件 、 目 标 文 件和 可 执 行 文 件 。
• 4. 构 成 文 件 的 基 本 单 元 与 流 式 文 件
• C 语 言 将 文 件 看 作 由 一 个 一 个 的 字 符 ( ASCII 码 文 件 ) 或 字 节 ( 二 进 制 文 件 ) 组 成 的 。这 种 文 件 称 为 流 式 文件。而在其他高级语言中,组成文件的基本单位是 记 录 , 对 文 件 操 作 的基 本 单 位 也 是 记 录 。
C第12章 位运算 C语言程序设计教程
printf(“a^b=%x\n”,a^b);
}
此位翻转
结果:enter two hex number:10,35
a^b=25
按位取反运算符
❖~是一个单目运算符
❖作用:使一个数据中所有位都取其反值,即0变1, 1变0。
例:~a a= 0 0 0 0 0 0 1 1 ~a= 1 1 1 1 1 1 0 0
❖作用:将一个数中各个位全部左移若干位,移出 的部分舍弃,右边空出来的位置补零。
例:a<<2
a= 1 0 0 0 0 1 0 1 ma<a<in2(=) 1 0 0 0 0 1 0 1 0 0 { unsigned char x,b;
(十六进制数85) (十六进制数14)
舍弃printf(“enter a hex numbers补:”零); scanf(“%x”,&x);
struct packed_data *p=&x;
x.a x.b x.c x.d p->a p->b p->c p->d
❖可以给位段赋值
x.a=2 x.b=1 x.c=7 x.d=0
b=x<<2;
printf(“%x\n”,b);
}
结果:enter a hex number:85
14
右移运算符
❖>>是一个双目运算符
❖作用:将一个数中各个位全部右移若干位,右移出 的位丢弃,左端的补充要区分两种情况。
(1)无符号数,右移时左端补零
(2)有符号数,如果符号位为0(即正数),则左边补入 0,如果符号位为1(即负数),则左边补入的全是1。
例:a^mb ain()
{ au=nsi0gn0ed0 c1h0ar0a0,b0;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12.2 位 段
#include<stdio.h> int main() {
struct cbit {
unsigned a:1; unsigned b:3; unsigned c:4; } bit, *pbit; bit.a = 1; bit.b = 7; bit.c = 15; printf("%d,%d,%d\n", bit.a, bit.b, bit.c); pbit = &bit;
相关概念
(1) 位段的定义与结构体的定义相仿;格式如下: struct 位段结构名 { 类型说明符1 位段名1:位段长度1; //最低位; 类型说明符2 位段名2:位段长度2; //次低位; 类型说明符3 位段名3:位段长度3; ...... 类型说明符N 位段名N:位段长度M; //最高位; };
return 0;
}
12.1.1 按位与运算符(&)
实例分析 设a=84(二进制为01010100),把其中从左边算起的 第3,4,5,7,8位保留下来。
12.1.2 “按位或”运算符(|)
基本形式 或运算的基本格式为:a | b
12.1.2 按位或运算符(|)
#include <stdio.h>
12.1.4 取反运算符(~)
#include <stdio.h> int main() {
int a=077; printf("%d",~a); return 0; }
程序运行结果如下: 192
12.1.5 左移运算符(<<)
基本形式
左移运算的基本格式为: a<<n
功能:左移运算符是用来将一个数的各二进制位左 移若干位,移动的位数由右操作数指定(右操作数必须 是非负值),其右边空出的位用0填补,高位左移溢出 则舍弃该高位。
pbit -> a = 0; pbit -> b &= 3; pbit -> c |= 1; printf("%d,%d,%d\n", pbit -> a, pbit -> b, pbit -> c); return 0; }
程序运行结果如下: 1,7,15 0,3,15
小型案例
问题: 对一无符号整数x进行右循环移y位后再取 其从右端开始的m—n位。
作业
1、教材第十二章课后习题。 2、作业集第十二章。
printf("请输入口令密码: "); scanf("%d",& code ); password =code>>2; printf("加密秘钥是:%d\n",password); system("PAUSE"); system("CLS"); printf("请输入登录口令: "); scanf("%d",&login); login==password?printf("正确,欢迎进入"):printf("不正确, 不能使用"); }
的按位运算。
12.1.1 “按位与”运算符(&)
基本形式 与运算的基本格式为:a & b
12.1.1 按位与运算符(&)
#include <stdio.h> int main( ) {
程序运行结果如下: a=84 b=59 c=16
int a=84,b=59,c;
c=a&b;
printf("a=%d\t b=%d\t c=%d\n",a,b,c);
(2) 如果相邻的两个位段字段的类型相同,且其位宽之和大于 其类型的sizeof()大小,则后面的位段字段将从下一个存储单元的 起始地址处开始存放,其偏移量恰好为其类型的sizeof()大小的整 数倍;
(3) 如果相邻的两个位段字段的类型不同,则各个编译器的具 体实现有差异,VC6采取不压缩方式,GCC和Dev-C++都采用压缩 方式;
12.2 位 段
相关概念 (2) 位段变量的说明与结构体变量的说明方式相同;可采用 两种方式:
先定义后说明、同时定义说明; (3) 位段变量的使用与结构体变量的使用法相同,有两 种形式:
变量: 位段变量名.位段名 指针: 位段指针名->位段名
12.2 位 段
位段的存储规则
(1) 如果相邻的两个位段字段的类型相同,且其位宽之和小于 其类型的sizeof()大小,则其后面的位段字段将紧邻前一个字段存 储,直到不能容纳为止;
➢相关知识 理解位运算:按位与、或、异或、取反、左移和右移
第12章 位运算
➢12.1 位的运算 ➢12.2 位段
学习目标
12.1 位的运算
掌握位运算符的概念 熟练应用常用的位运算
12.1 位的运算
运算符 名称
使用格式
运算符 名称
使用格式
&
按位与 表达式1&表达式2 ~
按位取反 ~表达式
|
按位或 表达式1|表达式2 <<
return 0;
}
12.1.3 异或运算符(∧)
实例分析 将八进制721与八进制52进行按位异或运算。
12.1.4 “取反”运算符(~)
基本形式 取反运算的基本格式为: ~ a
12.1.4 取反运算符(~)
实例分析 将八进制77进行按位取反运算。
先将77(8)化成二进制111111(2) 然后进行取反:~111111=000000
12.2 位 段
位段的存储规则 (4) 如果位段字段之间穿插着非位段字段,则不 进行压缩; (5)整个位段结构体的大小为其最宽基本类型成员 大小的整数倍; (6) 位段字段在内存中的位置是按照从低位向高 位的顺序放置的; (7) 取地址操作符&不能应用在位段字段上;
12.2 位 段
实例分析 编写程序输出各个位段的值。
12.1.6 右移运算符(>>)
#include<stdio.h>
int main() {
int a=-9, x=0;
程序运行结果如下: -9>>1=-5
x=a>>1;
printf("%d >>1=%d\n", a, x);
return 0;
}
12.2 位 段
学习目标 熟练位段的定义及使用方法
12.2 位 段
12.1.6 右移运算符(>>)
实例分析
编写程序实现对-9右移1位的功能。
分析:当对负数进行右移操作,左端补1不补0。-9右移一位的过程如下: ①-9的原码形式: 1000000000001001 最高位的1表示该数为负数 ②-9的反码形式: 1111111111110110 最高位不变,其余各位取反 ③-9的补码形式: 1111111111110111 对反码加1 ④右移1位-9>>1: 11111111111110111 挤掉右端1位,左端补1 ⑤求-9>>1的反码: 1111111111111010 对补码减1而得 ⑥求-9>>1的原码: 1000000000000101 反码最高位不变,其余取反 因此,-9>>1的值由-9变为-5。
int main( )
{
int a=060; int b=017; int c;
程序运行结果如下: a=48 b=15 c=63
c=a|b;
printf("a=%d\t b=%d\t c=%d\n",a,b,c);
return 0;
}
12.1.2 按位或运算符(|)
实例分析 将八进制60与八进制17进行按位或运算。
12.1.5 左移运算符(<<)
#include <stdio.h> int main() {
int a=15; printf("%d",a<<2); return 0; }
程序运行结果如下: 60
12.1.5 左移运算符(<<)
实例分析 若a=15,将a的二进制数左移2位。
说明:左移1位相当于该数乘以2,左移2位相当于 该数乘以2*2=4,15<<2=60,即乘了4。
12.1.6 右移运算符(>>)
基本形式
右移运算的基本格式为: a>>n 功能:右移运算符是用来将一个数的各二进制位 右移若干位,移动的位数由右操作数指定(右操作数 必须是非负值),移到右端的低位被舍弃,对于无符 号数,高位补0。对于有符号数,取决于所使用的系统 :高位补0的称为“逻辑右移”,高位补1的称为“算 术右移”。
小型案例
分析: 第一步:将无符号整数x进行右循环移y位。
无符号整数x右循环移y位后,x中原来左面(16-y)位右移y位, 原来右端y位移至最左面y位。现系统设用2个字节存放一个无 符号整数。
小型案例
分析: 第二步:取其从右端开始的m—n位。
代码:
小型案例
小型案例
第12章 位运算
【例】数据加解密文件。 #include <stdio.h> main() {int code ,password ,login;
C语言程序设计
课程回顾
1、标识符的定义规则? 2、C语言的基本数据类型有哪些? 3、运算符的类型及优先级。
任务 生成加密秘钥实例
➢任务描述 安全验证2.0版本,为了进一步提计算 机的安全性,希望程序员小王编写一 个加密口令验证模块,在进入计算机 系统前,两层保证用户的合法性。如 何实现呢?(利用位运算符)