- C++中按位进行的运算符,简称位运算
- 在计算机中,数据以二进制的形式储存
- 每8位(bit)构成一个字节(byte)
- 每个位具有0或1两种状态中的一种
C++中共包含6种按位运算符:
- 按位与运算符
&
- 按位或运算符
|
- 异或运算符
^
- 按位取反运算符
~
- 左移运算符
<<
- 右移运算符
>>
Tips:按位运算符只能对字符整型以及数值整型数据类型的常量或变量使用,不能对浮点类型数据进行计算。
位与运算符
按位与运算符&
对两个操作数按照二进制位进行与运算。
Tips:对于操作数a和b,下表演示了&
运算符的工作方式:
Tips:&
运算符只有在两个操作数的对应位同时为1时,才会得到结果1。
int A = 60; // 0011 1100
int B = 13; // 0000 1101
cout << "A & B = " << (A & B) << endl;
A & B = 0000 1100
二进制数0000 1100的值为12,故打印结果可得:
A & B = 12
位或运算符
按位或运算符|
对两个操作数按照二进制位进行或运算。
Tips:对于操作数a和b,下表演示了|
运算符的工作方式:
Tips:|
运算只要在两个操作数的对应位存在1时,就可以得到结果1
int A = 60; // 0011 1100
int B = 13; // 0000 1101
cout << "A | B = " << (A | B) << endl;
A | B = 0011 1101
二进制数0011 1101的值为61,故打印结果可得:
A | B = 61
位异或运算符
位异或运算符^
对两个操作数按照二进制位进行异或运算。
Tips:对于操作数a和b,下面的真值表演示了^
运算符的工作方式:
Tips:异或运算在两个操作数的对应位不相同时,会得到结果1;也可以看作是二进制下的无进位相加。
int A = 60; // 0011 1100
int B = 13; // 0000 1101
cout << "A ^ B = " << (A ^ B) << endl;
A ^ B = 0011 0001
二进制数0011 0001的值为49,故打印结果可得:
A ^ B = 49
位取反运算符
C++中,取反运算符~
对单个二进制操作数按位进行取反运算。
Tips:二进制位取反规则是0变1,1变0。
int A = 60; // 0011 1100
cout << "~A = " << (~A) << endl;
对A应用取反运算符进行计算,可以得到:
~A = 1100 0011
打印结果可得:
~A = -61
在计算机中,所有的二进制数据都是用补码保存的。
- 正数的补码就是原码本身
- 正数变量A的原码为
0011 1100
,补码同样等于0011 1100
。
- 正数变量A的原码为
- 负数的补码是在其原码的基础上,符号位不变,其余各位取反然后+1
- 负数变量~A的原码为
1100 0011
,补码等于1011 1100 + 1 = 1011 1101
,值为-61,故~A = -61
。
- 负数变量~A的原码为
Tips:一个对操作数取反运算的简单规律是:会得到比原先操作数的相反数还小1的结果。
左右移运算符
在C++中,左移运算符<<
可以将一个操作数的各二进制位全部左移若干位。
- 左边多余的二进制位将被丢弃
- 右边不足的二进制位将被补0
int A = 60; // 0011 1100
cout << "A << 1 = " << (A << 1) << endl;
对A应用左移运算符进行1次位移,可以得到:
A << 1 = 0111 1000
二进制数0111 1000的值为120,故打印结果可得:
A << 1 = 120
Tips:在结果符号位不改变,并且没有超过表示范围的情况下,左移运算符移动了几位,相当于对原操作数进行了几次乘2运算。
在C++中,右移运算符>>
可以将一个操作数的各二进制位全部右移若干位。
- 右侧多余的位将会被舍弃
- 左侧对于无符号数,会在左侧补0
- 左侧对于有符号数,会用符号位补齐:正数为0,负数为1
int A = 60; // 0011 1100
cout << "A >> 2 = " << (A >> 2) << endl;
对A应用右移运算符进行2次位移,可以得到:
A >> 2 = 0000 1111
二进制数0111 1000的值为120,故打印结果可得:
A >> 2 = 15
Tips:乘除优先于加减优先于赋值运算符,移位优先级高于异或
小结:
- 按位与运算符
&
:同时为1时,才会得到结果1- 按位或运算符
|
:存在1时,就可以得到结果1- 异或运算符
^
:不相同时,会得到结果1- 按位取反运算符
~
:0变1,1变0 (比原先操作数的相反数还小1)- 左移运算符
<<
:左移移动几位,相当于进行了几次乘2运算- 右移运算符
>>
:右移移动几位,相当于进行了几次除以2运算
练习:输入三个整数a,b,c,输出a与b或运算的值,再与c与运算的结果。
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
cout << ((a | b) & c);
return 0;
}