1、&运算符的应用;
A. 清零某些位(与0相&);B. 保留某些位(与1相&) ;
2. |运算符的应用:
置位某些位;
3. ^运算符的应用:
A. 特定位翻转(与1相^);B.保留特定位(与0相^);C. 交换两个值,不用临时变量;
4. ~运算符的应用:
为了保证可移植性:可用以下方法: a = a&~1;
5. 从一个数中第m位开始取其右面n位程式为:
c = a>>(m-n+1) & ~(~0<<n)
6. 左移与左移运算
#include <stdio.h>
int main(void)
{
/*位右移运算*/
#if 0
int a = 0xFFFFFFFF;
int b = a >> 8;
printf("b = %x/n",b); /* 输出结果为FFFFFF 符号位为0,则右移后高位补0*/
#endif
#if 0
int a = 0xFFFF0000;
int b = ~a >> 8;
printf("b = %x/n",b); /* 输出结果为FF 取反后,符号位为0,则右移后高位补0*/
#endif
#if 0
int a = 0xF000;
int b = ~a >> 8;
printf("b = %x/n",b); /* 输出结果为FFFFFF0F 取反后,符号位为1,则右移后高位补1*/
#endif
#if 0
unsigned int a = 0xF000;
unsigned int b = ~a >> 8;
printf("b = %x/n",b); /*输出结果为FFFF0F*/
#endif
#if 0
unsigned char a = 0x33;
unsigned char b = ~a >> 4;
printf("b = %x/n",b); /*输出结果为FC*/
#endif
#if 0
char a = 0x33;
char b = ~a >> 4;
printf("b = %x/n",b); /*输出结果为FFFFFFFC*/
#endif
/*位左移运算*/
#if 0
char a = 0x33;
char b = ~a << 4;
printf("b = %x/n",b); /*输出结果为FFFFFFC0*/
#endif
#if 0
unsigned char a = 0x33;
unsigned char b = ~a << 4;
printf("b = %x/n",b); /*输出结果为C0*/
#endif
#if 0
int a = 0xF000;
int b = ~a << 8;
printf("b = %x/n",b); /* 输出结果为FF0FFF00*/
#endif
#if 1
unsigned int a = 0xF000;
unsigned int b = ~a << 8;
printf("b = %x/n",b); /* 输出结果为FF0FFF00*/
#endif
return 0;
}
在进行位左移/右移运算的规则;
1、左移时,高位移出,低位补零;若不是以无符号字符型输出时,其输出是按整形输出;
2、右移时,有符号数,低位移出,高位补1 还是0 ,关键是看其符号位是1还是0;
无符号数,低位移出,高位补0;
3、只对有符号数进行右移位运算时,其数据按无符号数进行处理;
以上程序是在GCC编辑器上进行编辑得来的数据;