基本概念
整数在计算机中用二进制的位来表示,C语言提供一些运算符可以直接操作整数中的位,称为位运算。位运算是指按二进制位进行的运算,C语言不直接支持位运算,必须借助于位运算符完成。运算对象只能为整型或字符型数据
按位与 &
// 按位与 两个数都为1 结果是1
1011 1000 = 0xb8
& 0101 0111 = 0x57
0001 0000 = 0x10;
作用:位(1或0)和 1按位与得本身
按位或 |
两个数中有一个为1则为1
1011 1000 = 0xb8
| 0101 0111 = 0x57
1111 1111 = 0xff
作用:与0或得本身,与1或得1
按位异或 ^
相同位为0 ,不同为1
1011 1000 = 0xb8
0101 0111 = 0x57
^ 1110 1111 = 0xef;
作用:与0异或得本身, 1异或 取反
按位取反 ~
0变1,1变0
1011 1000 = 0xb8
~ 0100 0111 = 0x47
左移 <<
左边丢弃,右边补0
```c
int main()
{
unsigned char a = 3;//0000 0011
unsigned char b = a << 1;//0000 0110
printf("%d\n",b);//6 3*2^1
b = a << 2;
printf("%d\n", b);//6 3*2^2
b = a << 3;
printf("%d\n", b);//6 3*2^3
b = a << 6;//1100 0000
printf("%d\n", b);//6 3*2^6
b = a << 7;//1000 0000
printf("%d\n", b);//6 3*2^7
printf("%d\n", (unsigned char )(a<<7));//6 3*2^7
system("pause");
return 0;
}
左移时在最高位的1移出时次高位还为1时,会有倍数关系,注意不要将一个数的所有位都移出,否则编译器可能会报错
右移 >>
由于右移时会向最高位补数,但是最高位对有符号数来说是符号位,0代表正数,1代表负数,所以右移时会区分是算数右移还是逻辑右移,不同的编译器会做不同的右移。算术右移(vs,qt)
算术右移:有符号数,如果为正数,则左边移入0,右边丢弃,如果为负数,左边移入1,右边丢弃
逻辑右移:不关心正数、负数,左边均移入0,右边丢弃