一、C++ 位运算

来源:互联网 发布:电脑软件 知乎 编辑:程序博客网 时间:2024/05/29 18:12

C++ 位运算

一、位运算符

1.1 与或非、异或

&:按位与(双目),两个操作数均为1时结果才为1
|:按位或(双目),只要有一个操作数为1结果就为1
^:按位异或(双目),两个操作数结果不同时结果为1,相同时结果为0
~:按位取反(单目),取反

1.2 左移、右移

<<:左移(双目),表达式:a << b的值是:将a各二进位全部左移b位后得到的值。左移时,高位丢弃,低位补0。 a 的值不因运算而改变。

>>:右移(双目),表达式:a >> b的值是:将a各二进位全部右移b位后得到的值。右移时,移出最右边的位就被丢弃。 a 的值不因运算而改变。

对于有符号数,如long,int,short,char类型变量,在右移时,符号位(即最高位)将一起移动,并且大多数C/C++编译器规定, 如果原符号位为1,则右移时高位就补充1,原符号位为0,则右移时高位就补充0。

二、按位与

通常用来将某变量中的某些位清0且同时保留其他位不变。也可以用来获取某变量中的某一位

例如,如果需要将int型变量n的低8位全置成0,而其余位不变,则可以执行:
n = n & 0xffffff00;
也可以写成:
n &= 0xffffff00;
如果n是short类型的,则只需执行:
n &= 0xff00;

三、按位或

按位或运算通常用来将某变量中的某些位置1且保留其他位不变

例如,如果需要将int型变量n的低8位全置成1,而其余位不变,则可以执行:
n |= 0xff;
0xff: 1111 1111

四、按位异或

按位异或运算通常用来将某变量中的某些位取反,且保留其他位不变

例如,如果需要将int型变量n的低8位取反,而其余位不变,则可以执行:
n ^= 0xff;
0xff: 1111 1111

异或运算的特点是:如果 a^b=c,那么就有 c^b = a以及c^a=b。 (穷举法可证)

另外,异或运算还能实现不通过临时变量,就能交换两个变量的值:

int a = 5, b = 7;
a = a ^ b;
b = b ^ a;
a = a ^ b;

即实现a,b值交换。穷举法可证。

五、左移、右移

左移n位相当于乘以2^n;右移n位相当于除以2^n,结果往小取整(比如右移后结果为-1.0213,取整后为-2)

六、小结

按位与
1. 用于清0(&0)
2. 保留某些位不变(&1)
3. 获取某位(该位&1,其他&0)

按位或
1. 置1(|1)
2. 保留某些位不变(|0)

按位异或
1. 取反(^1)
2. 保留某些位不变(^0)
3. 实现a、b交换(a^=b; b^=a; a^=b)

左移
1. 左移n位相当于乘以2^n

右移
1. 右移n位相当于除以2^n
2. 结果往小取整

0 0
原创粉丝点击