首先注意!位操作符都是对补码的比特位进行操作
&与
介绍:按位与,二进制位只要有 0 就是 0 ,全是1 才为1
技巧:常用在将某个位修改成0
如:char a = 1000 1101 ,想要把第三位改成0
则可以让1000 1101 与 1000 1001进行 & 操作
a的第三位与 1 按位与之后,第三位会被统一成0。
| 或
介绍:按位或,二进制位只要有 1 就是 1 ,全是0 才为0
技巧:常用在将某个位修改成1
如:char a = 1000 1001 ,想要把第三位改成1
则可以让1000 1001 与 1000 1101进行 | 操作
a的第三位与 0 按位或之后,第三位会被统一成1。
^异或
介绍:比特位相同为 0 ,相异为1
比如 1100 ^ 0001 结果是 0010
应用技巧:任意一个整数n
n ^= n 则n为0
n ^= 0 则n为n
即:1.自己和自己异或,则结果为0
2.自己和0异或,结果为自己
3.常用来修改某个比特位
eg:int a = 0b0000 1111 想要修改第一位
只需要 a^=0b00000001; //0异或之后还是原数,1异或之后,是1为0(相同),是0为1(相异);
int main()
{
int b = 0b00001111; //15
printf("%d ", b);
b ^= 0b00000010; //13
printf("%d", b);
return 0;
}
注意:^符合交换律:a^b^a 即a^a^b
~按位取反
所有位按位取反
比如 1000 取反之后,结果为 0111
技巧:
int a;
~a的结果是 - a - 1
int main()
{
int a = 10;
int b = -10;
printf("a=%d,b=%d", ~a, ~b); // -11 9
}
>>右移
逻辑右移:右移,最高位补充0。
算数右移:右移,最高位补充符号位。
如何右移取决于编译器,VS采用算数右移(算术右移可以保证符号不变)
技巧:
n 右移之后,如果为算数右移,那么结果是 n / 2
如果右移x位,那么结果将为 n / (2^x)
int main()
{
int a = -10;
a >>= 1;
printf("%d", a); //结果为 - 5
}
<<左移
最高位缺失,最低位补0
技巧:左移n位,结果为 原数 * 2^n
int main()
{
int a = -10;
a <<= 1;
printf("%d", a); //结果为 -20
}
值得一提
1.>>与<<用来计算的时候,可以极大地提高算数效率!
2.当相同的运算符重叠的时候,比如!!a,那么会从右往左计算,计算顺序为 !(!a)