分类: 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 |