16位异或和计算 c语言,《C语言程序设计基础与实训教程》第12章:位运算.ppt

《C语言程序设计基础与实训教程》第12章:位运算

第12章 位运算 学习目的与要求: 所谓位运算是C语言的一种特殊运算功能, 它是以二进制位为单位进行运算的。位运算符只有逻辑运算和移位运算两类。位运算的对象只能是整型数据和字符型数据。 本章主要介绍基本位运算符、位段结构类型基本概念及应用,要求掌握基本位运算符的含义、功能、优先级,能够进行按位与、或、异或、取反以及左移和右移运算,并掌握位段变量的定义、作用及其引用。 12.1 位运算符 当两个运算对象不同时,系统将自动进行如下处理。 (1)先将两个运算数右端对齐。 (2)再将位数不足的一个运算对象向高位扩 充。即:无符号位和正数左端用0补齐;负数左端用1补齐;然后对位数相等的两个数按位数进行计算。 因此,5&3的值得1。如果参加&是负数运算的是负数(如-5 & -3),则以补码形式表示为二进制数,然后按位进行“与”运算。 按位与有一些特殊的用途: (1) 清零。 如果想将一个单元清零,即使其全部二进位为0,只要找一个二进制数,其中各个位符合以下条件:原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。 如:原有数另找一个数,设它它符合以上条件,即在原数为1的位置上,它的位值均为0。将两个数进行&运算: 按位或运算常用来对一个数据的某些位定值为1。如:a是一个整数(16位),有表达式a |0377则低8位全置为1。高8位保留原样。 例如:9|5可写算式如下:00000101(十进制为13)可见9|5=13main(){int a=9,b=5,c;c=a|b;printf("a=%d\nb=%d\nc=%d\n",a,b,c);}       l? 位结构定义的一般形式为: struct位结构名{  数据类型 变量名: 整型常数;  数据类型 变量名: 整型常数; } 位结构变量;?? 其中: 整型常数必须是非负的整数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。 变量名是选择项, 可以不命名, 这样规定是为了排列需要。       可以任意指定从右面第m位开始取其右面n位。只需将程序中的“b=a>>4”改成“b=a>>(m-n+1)”以及将“c=~(~0<<4)”改成“c=~(~0<<n)”即可。 例12.2循环移位。要求将a进行右循环移位。见图12.4。图12.4表示将a右循环移n位。即将a中原来左面(16-n)位右移n位,原来右端n位移到最左面n位。今假设用两个字节存放一个整数。为实现以上目的可以用以下步骤: ① 将a的右端n位先放到b中的高n位中。可以用下面语句实现:b=a<<(16-n); ② 将a右移n位,其左面高位n位补0。可以用下面语句实现: c=a>>n; ③ 将c与b进行按位或运算。即 c=c|b; 程序如下: main( )    {unsigned a,b,c; int n; 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。同样可以左循环位移。 12.3 位段 C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域” ( bit field) 。实际上它是字节中一些位的组合,因此也可认为它是”位信息组”,利用位段能够用较少的位数存储数据。 位段结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便。 例如: 下面定义了一个位结构。 struct{ unsigned incon: 8; /*incon占用低字节的0~7共8位*/ unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/ unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/ unsigned blink: 1; /*blink占用高字节的第7位*/ }ch;?? 再看一个例子:    struct packed-data     { unsigned a∶2; u

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值