第十二章 位运算2
《补充二位运算》PPT课件
例
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);
C语言新教材PPT课堂课件第12章位运算
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章 位运算
第 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
第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
C++课件:第12章位运算
右移运算符(>>)
二进制右移运算
右移运算符(>>)将一个整数的二进制 表示向右移动指定的位数,左侧用符 号位填充(对于有符号整数)。右移n 位相当于将该数除以2的n次方。
03
位运算示例
示例一:使用位运算符实现加密和解密
总结词
通过位运算实现简单的加密和解密功能
详细描述
使用位运算符对二进制数进行异或(XOR)运算,可以实现简单的加密和解密 功能。异或运算的特点是,相同位得0,不同位得1,因此可以对二进制数据进 行加密或解密。
04
位运算的应用场景
数据加密
通过将数据转换为二进制形式,并使用位运 算进行加密和解密操作,可以保护数据的机 密性。
硬件控制
在嵌入式系统或硬件编程中,使用位运算可 以对硬件寄存器进行直接操作,实现快速、 高效的硬件控制。
图像处理
在图像处理中,可以使用位运算实现像素级 别的操作,如图像的合并、掩码处理等。
答案
可以使用按位与运算符(&)实现两个整数的 对应位进行逻辑与操作。例如,要将整数x和y 的对应位进行逻辑与操作,可以使用x &= y的 语句。这将把x和y的对应位进行逻辑与操作, 并将结果存储在x中。
05
总结与回顾
位运算的重要性和应用场景
重要性和应用场景
位运算在计算机科学中具有广泛的应用,如 数据加密、网络协议处理、硬件交互等。通 过位运算,可以对二进制位进行操作,从而 实现高效的底层操作和控制。
02
位运算符详解
按位与运算符(&)
二进制按位与运算
按位与运算符(&)对两个整数的二进制表示进行逐位比较,只有当两个相应的二进制 位都为1时,结果位才为1,否则为0。
清华浩强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
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语言第十二章位运算
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.1.2 按位或运算
按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只 要对应的二个二进位有一个为 1 时,结果位就为 1。参与运算的两个数均以补码出现。
例如:9|5 可写算式如下:
【例 12.2】
00001001
|00000101 00001101
main(){
}
int a=9,b=5,c;
12.1.4 求反运算
求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位 求反。 例如~9 的运算为:
~(0000000000001001)结果为:1111111111110110
12.1.5 左移运算
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若 干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补 0。
12
位运算 ................................................................1
12.1 位运算符C语言提供了六种位运算符: ................................1
12.1.1
按位与运算 ................................................1
unsigned a,b; printf("input a number: "); scanf("%d",&a); b=a>>5; b=b&15; printf("a=%d\tb=%d\n",a,b); }
C语言第12章位运算法则
第 12 章 位运算 1/5
第 12 章 位运算
位运算: 是指对二进制按位进行运算。如:将一个二进制的位左移或右移,两个二进制数相加 等。
12.1 位运算
C 语言提供的位运算符: & 按位与 | 按位或 ∧ 按位异或 ~ 取反 << 左移 >> 右移
b=a<<(16-n);
c=a>>n;
cபைடு நூலகம்c|b;
printf(“%o\n%o”,a,c);
}
12.3 位域(位段)
信息可以用 1 字节、2 字节、4 字节、8 字节表示。 例如,用 1 字节表示一个英文字符,2 字节表示一个汉字字符,4 字节表示一个实数,....等。
第 12 章 位运算 4/5
|=, 例:a|=b 相当于 a=a|b
>>=, 例:a >>=b 相当于 a=a>>b
<<=, 例:a<<=b 相当于 a=a<<b
∧=, 例:a∧=b a = a∧b
12.2 位运算举例
例[12.1] 取一个整数 a 从右端开始的 4~7 位。 比如,
第 12 章 位运算 3/5
0000,0000,1101,1001(16 位二进制) 方法: (1) 先使 a 右移 4 位,使要取出的几位移到最右端。a>>4 (2) 设置一个低 4 位全为 1,其余为 0 的数
二、“按位或”运算符 规则: 参加运算的两个运算量,如果两个对应位中有 1,则 该位结果值为 1,否则为 0。 例如 X=10001001 Y=11101110
第十二章 位运算
272第十二章 位运算C 语言可以对计算机硬件进行操作,其操作主要是通过位运算实现的。
位运算能满足编写系统软件的这一需要,是C 语言的重要特色。
在计算机用于检测和控制领域中要也用到位运算的知识。
所谓位运算就是以位为单位进行二进制的运算。
C 语言提供了位运算的功能, 与其他高级语言相比具有一定的优越性。
12.1位运算符与位运算C 语言提供的位运算符见表12.1表12.1中除了取反运算~是单目运算符外,其余都是双目运算符。
位运算符只能用于整型量(包括int ,char ,short ,long ,unsigned 等),而不能用于操作浮点型量(float 和double)。
1.按位与运算符&如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
即 0&0=0,0&1=0,1&0=0,1&1=1。
例如:a=0xb9(十进制数185),b=0x83(十进制数131),按二进制位进行与运算的结果为0x81(十进制数129)如果参加按位与运算的是负数,则以补码形式表示为二进制数,然后按位进行“与”运算。
按位与运算经常用于取一个数据的若干位,如有一个整型值i ,它占两个字节共16位二进制,数值为:01011000100111001若想取其低字节8位,可用表达式: i&255这是因为255的二进制是0000000011111111,上面的求值形式为:10111001 a: 0xb9 10000011 b: 0x8310000001 结果: 0x81 (&)273也就是说,把需要取出的部分全部用1按位与,而其余的全用0按位与。
这种方法适合于选取任何若干位,不一定要求是连续的若干位。
2.按位或运算符|两个相应的二进制位中只要有一个为1,该位的结果值为1。
即0|0=0,0|1=1,1|0=1,1|1=1。
下面是a 与b 进行按位或运算。
按位或运算常用于将数据的某些位置1,如:i|255 或 i|0377,将i 的低字节8位置1,而高位保留不变。
第12章位运算
第三节 位段
有些信息在存储时,并不需要占用一个完整的字 节,而只需占几个或一个二进制位,因此引入 了位段的概念 所谓“位段”是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数
第三节 位段
一、位段的定义和位段变量的说明 形式为: struct 位段结构名 { 位段列表 }; 其中位段列表的形式为: 类型说明符 位段名:位段长度
第一节 位运算符和位运算
例如: a=00000011(十进制3) a<<4 a=00110000(十进制48)
第一节 位运算符和位运算
五、右移运算 把“>>”左边的运算数的各二进位全部右移若 干位,“>>”右边的数指定移动的位数,对于 有符号数,在右移时,符号位将随同移动。当 为正数时,最高位补0,而为负数时,符号位 为1,最高位是补0或是补1 取决于编译系统的 规定。Turbo C和很多系统规定为补1
第三节 位段
例如: struct { int int int };
bs a:8; b:2; c:6;
第三节 位段
对于位段定义的说明: 1.一个位段必须存储在同一个字节中,不能跨两 个字节。如一个字节所剩空间不够存放另一位 段时,应从下一单元起存放该位段。也可以有 意使某位段从下一单元开始
第三节 位段
第一节 位运算符和位运算
3.要保留哪一位就与一个只有在该位取1的二进 制数作& 例如: 01001011 & 00001000 (保留第4位) 00001000
第一节 位运算符和位运算
二、按位或运算 只要参与运算的二个二进位有一个为1时,结 果位就为1,参与运算的两个数均以补码出现 0|0=0 0|1=1 1|0=1 1|1=1
全国计算机二级C语言课件 第12章 位运算
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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
右移运算符(>>)
右移运算符是a>>2表示将a的各二进制位右移2 位,移到右端的低位被舍弃,对无符号数,高位 补0。 例如:a=017时: a的值用二进制形式表示为 00001111, 舍弃低2位11,得到 a >> 2 == 00000011
右移一位相当于除以2 右移n位相当于除以2^n
位运算赋值运算符
位运算符与赋值运算符可以组成复合赋 值运算符。 例如: &=, |=, >>=, <<=, ∧= ∴
a & = b 相当于 a = a & b a << =2 相当于 a = a << 2
位运算举例
题目:取一个char a从右端开始的2~5位。
① 先使a右移2位:a >> 2 目的是使要取出的那几位移到最右端,图示: ② 设置一个低4位全为1,其余全为0的数。
例如:a =<< 2 将a的二进制数左移2位,右 边补0。 若a=15,即二进制数00001111, 左移2位得00111100,(十进制数60)
若高位左移后溢出,舍弃。
左移运算符(<<)
左移1位相当于该数乘以2,左移2位相当于 该数乘以4,15<<2=60,即乘了4。
但此结论只适用于该数左移时被溢出舍弃的高 位中不包含1的情况。 假设以一个字节(8位)存一个整数,若a为 无符号整型变量,则a=64时,左移一位时 溢出的是0,而左移2位时,溢出的高位中包 含1。
在右移时,需要注意符号位问题:
对无符号数,右移时左边高位移入0; 对于有符号的值,如果原来符号位为0(该数为 正),则左边也是移入0。
如果符号位原来为1(即负数), 则左边移入0还是 1,要取决于所用的计算机系统。有的系统移入 0,有的系统移入1。
移入0的称为“逻辑右移”, 即简单右移;移入 1的称为“算术右移”。
“取反”运算符(~)
~是一个单目(元)运算符,用来对一个二进 制数按位取反,即将0变1,将1变0。 例如,~025是对八进制数25(即二进制 数00010101)按位求反。 例如:
00010101
~
11101010 ( 八进制数 -25 )
左移运算符(<<)
左移运算符是用来将一个数的各二进制 位全部左移若干位。
关于位段的定义和引用的说明
(3) 一个位段必须存储在同一存储单元中,不能 跨两个单元。如果第一个单元空间不能容纳下 一个位段,则该空间不用,而从下一个单元起 存放该位段。 (4) 可以定义无名位段。 (5) 位段的长度不能大于存储单元的长度,也不 能定义位段数组。 (6) 位段可以用整型格式符输出。 (7) 位段可以在数值表达式中引用,它会被系统 自动地转换成整型数。
位段
C语言允许在一个结构体中以位为单位来指定 其成员所占内存长度,这种以位为单位的成员 称为“位段”或称“位域” ( bit field) 。利用 位段能够用较少的位数存储数据。
struct packed-data { unsigned a:2; unsigned b:6; unsigned c:4; unsigned d:4; int i; }data;
~ ( ~ 0 << 4 )
③ 将上面①、②进行&运算。
(a >> 4) & ~ ( ~ 0 << 4 )
编程检验!
循环移位
节为单位。实际上,有时 存储一个信息不必用一个或多个字节。 例如,“真”或“假”用0或1表示,只需1 位即可。 在计算机用于过程控制、参数检测或数据通信 领域时,控制信息往往只占一个字节中的一个 或几个二进制位,常常在一个字节中放几个信 息。
关于位段的定义和引用的说明
(1)位段成员的类型必须指定为unsigned或int类型。 (2) 若某一位段要从另一个字开始存放,可用以下形 式定义:
unsigned a:1; unsigned b:2;一个存储单元 unsigned:0; unsigned c:3;另一存储单元
a、b、c应连续存放在一个存储单元中,由于用了长度 为0的位段,其作用是使下一个位段从下一个存储单 元开始存放。因此,只将a、b存储在一个存储单元中, c另存在下一个单元(“存储单元”可能是一个字节,也 可能是2个字节,视不同的编译系统而异)。
在右移时,需要注意符号位问题:
例:a的值是十进制数 -2:
a == 1111 1110(用二进制形式表示) 无符号数:a>>1: 0111 1111 (逻辑右移时) 有符号数:a>>1: 1111 1111 (算术右移时) 光说不做不成,小甲鱼带大伙试验下! 天下事有难易乎,为之,则难者亦易已;不为, 则易者亦难已!