C12位运算.pptVIP

  • 5
  • 0
  • 约4.01千字
  • 约 21页
  • 2016-12-10 发布于重庆
  • 举报
C12位运算

12.1 位运算 C语言具有位逻辑运算和移位运算的独特功能,参与位运算的运算量必须是整数。位逻辑运算包括、|、∧、~四种运算,移位运算有、两种运算。其中~位单目运算符。 12.1.1 按位与 12.1.2 按位或 12.1.3 按位异或 12.1.4 按位取反 12.1.5 按位左移 12.1.6 按位右移 12.1.7 位运算的复合赋值运算符 12.1.1 按位与 12.1.2 按位或 12.1.3 按位异或 12.1.4 按位取反 12.1.5 按位左移 12.1.6 按位右移 例exp10_5:将一个数a的从右边数的第4~7取出. 步骤: 1. 先使被取出的几位,右移成为最低位. 2.求出一个数它的最后4位均为1,其余均为0. 3.将步骤1和步骤2得到的数进行与运算. main() {unsigned a, b,c d; scanf(“%o”,a); b=a4; c=~(~04); d=bc; printf(“%o\n%o\n”,a,d); } 12.1.7 位运算的复合赋值运算符 12.2 位段 12.2.1位段的概念 12.2.2位段的引用 12.2.3使用位段的要点 12.2.1位段的概念 a 12.2.2对位段中数据的引用方法 1、方法:通过结构体成员来应用: 如: data.a=2; data.b=6; 2、要点: 注意每个字段的最大取值范围. 如:data.a的取值只能是:0~3, 因为两位二进制最大表示的数为3. 1.若某个位段要从新的存储单元开始,可以这样定义: struct pack {unsigned a:2; unsigned :0; unsigned b:4; unsigned c:4; int x; }data; 位段的使用要点 2.一个位段存储在同一个机器字中,不能跨字存储. (假设机器的字长为16位) struct pack { unsigned a:2; unsigned b:5; unsigned c:10; unsigned d:4; int x; }data; 3.可以定义无名字段 struct pack { unsigned a:2; unsigned :5;/*空闲不用*/ unsigned b:2; unsigned c:4; int x; }data; 4.位段可以用十进制的整型形式输出,也可以用其他的整型格式输出(如八进制,十六进制和无符号),位段以整型的形式参加算术运算. 例:下列程序的输出结果是什么? #include <stdio.h> main() { struct equip { unsigned a:2; unsigned b:3; unsigned c:1; unsigned d:4; unsigned e:3; unsigned :3;}; union { struct equip eq; unsigned i;}abc; abc.i=255; printf(%d\n,abc.eq.d);} 运行结果为:4 12.2.3 长度运算` * * ? ? ? ? ? ? ? ? ? ? ? ? ? ? 参与运算的量,如果相对应的两位都为1,则该位的结果值为1,否则为0,即: 00==0 01==0 10==0 11==1 如:a的值为0x1234,b的值为0x00ff,ab运算的结果c应为: a 0001 0010 0011 0100 b 0000 0000 1111 1111 c 0000 0000 0011 0100 按位与常用于将某个运算量的某些位清0或提取某些位的值,如本例中,将变量的高8位清0,同时保留或提取低8位的值,可用一个高8位为0,低8位为1的值0x00ff和它进行按位与。 ? ? ? ? ? ? 参与运算的量,如果相对应的两位都为0,则该位的结果值为0,否则为1,即: 0|0==0 0|1==1 1|0==1 1|1==1 如:a的值为0x1234,b的值为0x00ff,a|b运算的结果c应为: a 0001 0010 0011 0100 | b 0000 0000 1111

文档评论(0)

1亿VIP精品文档

相关文档