位运算符

位运算符

位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。

按位取反:~

  • 将a每位上的1变为0,0变为1
  • 相当于~a = -a - 1

位与:&

  • 只有a和b对应位同为1的时候才为1
  • 掩码:将某些位设置为开(1)而某些位设置为关(0)
  • 关闭位:不影响其他位,只关闭特定位

位或:|

只要对应的两个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现出现

  • 要有a和b的对应位上有一个1就为1
  • 打开位:打开某一个特定的位(1),同时其他位保持不变

位异或:^

参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现

实例

两数相加

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

using namespace std;
int aplusb(int a, int b) {
if(b==0) return a;
aplusb(a^b,(a&b)<<1);
}
int main() {
int a, b;
cin >> a >> b;
cout << aplusb(a, b) << endl;
return 0;
}

两数相减

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>

using namespace std;

int add(int a, int b) {
if (b == 0) {
return a;
}
int s = a ^ b;
int c = (a & b) << 1;
return add(s, c);
}

int del(int a, int b) {
return add(a, add(~b, 1));
}

int main() {
int a, b;
cin >> a >> b;
cout << del(a, b) << endl;
return 0;
}