Chinaunix首页 | 论坛 | 博客
  • 博客访问: 714102
  • 博文数量: 96
  • 博客积分: 2110
  • 博客等级: 大尉
  • 技术积分: 1018
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-23 19:36
文章分类

全部博文(96)

文章存档

2013年(2)

2012年(17)

2011年(77)

分类: C/C++

2011-02-08 16:23:59

TAG:位运算,位运算符,复合的位运算 符,&=,!=,>>=,<<=,^=
TEXT:
在C语言中还提供复合的位运算符,如下:
&=、!=、>>=、<<=和^=
例如:a&=0x11等价于 a= a&0x11,其他运算符以此类推。
不同类型的整数数据在进行混合类型的位运算时,按右端对齐原则进行处理,按数据长度大的数据进行处理, 将数据长度小的数据左端补0或1。例如char a与int b进行位运算的时候,按int 进行处理,char a转化为整型数据,并在左端补0。补位原则如下:
1) 对于有符号数据:如果a为正整数,则左端补0,如果a 为负数,则左端补1。
2) 对于无符号数据:在左端补0。
例11-2 获得一个无符号数据从第p位开始的n位二进制数据。假设数据右端对齐,第0位二进制数在数 据的最右端,获得的结果要求右对齐。
#include
/*getbits:获得从第p位开始的n位二进制数 */
unsigned int getbits(unsigned int x, unsigned int p, unsigned n)
{
unsigned int a;
unsigned int b;
a=x>>(p+1);
b=~(~0<
return a&b;
}
void main()
{
unsigned int a=123;
unsigned int b;
b=getbits(a,2,4);
printf("a=%u\t b=%u\n",a,b);
printf("a=%x\t b=%x\n",a,b);
}
程序运行结果为
a=123 b=15
a=7b b=f
解释如下:a 的二进制形式如下:
0000 0000 0111 1011
左移p+1位(从0开始)
0000 0000 0000 1111
0的二进制形式如下:
0000 0000 0000 0000
0取反
1111 1111 1111 1111
0右移4位(从0开始)
1111 1111 1111 0000
0右移4位取反,因此b的二进制形式为
0000 0000 0000 1111
a&b的结果如下
0000 0000 0000 1111
提示 在某一平台进行程序开发时,首先要求了解此系统的基本数据类型的有效范围, 对涉及的位运算进行评估,特别是要对边界数据进行检测,确保计算正确。

REF:.txt


&=
例如:a&=0x11等 价于 a= a&0x11


!=
a!=0x11等价于 a= a!0x11


>>=
例 如:a>>=0x11等价于 a= a>>0x11。


<<=
a<<=0x11等 价于 a= a<<0x11。


^=
例如:a^=0x11等价于 a= a^0x11。


混合类 型位运算规则
TAG:位运算,位运算符,复合 的位运算符,混合类型位运算规则
TEXT:
不同类型的整数数据在进行混合类型的位运算时,按右端对齐原则进行处理,按数据长度大的数据进行处理, 将数据长度小的数据左端补0或1。例如char a与int b进行位运算的时候,按int 进行处理,char a转化为整型数据,并在左端补0。补位原则如下:
1) 对于有符号数据:如果a为正整数,则左端补0,如果a 为负数,则左端补1。
2) 对于无符号数据:在左端补0。
REF:.txt,复合的位运算符.txt
阅读(1562) | 评论(0) | 转发(0) |
0

上一篇:位移运算符

下一篇:位段

给主人留下些什么吧!~~