位运算(最好提前看一下逻辑运算符)

作用:

a,可以用来考试

b,线性基(异或)(数论)

c,0,1串

d,计数

e,集,或者状态

一,与运算(&)

$$(3)_{10} =(011)_2$$

$$(6)_{10}=(110)_2$$

如果二者取与运算(&)那么就是$$(010)_2$$

就是可以看出来如果两个不一样。那么就是0,两个都是0那么取与运算也是0

或运算(|)

$$(3)_{10} =(011)_2$$

$$(6)_{10}=(110)_2$$

如果二者取或运算(|)那么就是$$(111)_2$$

我们可以看出或运算只要两个不是0,那都是1

二,异或运算(^)

$$(3)_{10} =(011)_2$$

$$(6)_{10}=(110)_2$$

如果二者取异或运算(^)那么就是$$(101)_2$$

我们可以看出如果两个的值是不一样的那么就是取1,而两个一样就是取0,比较好记的方法是异就是不一样,所以有两个一样的是0,两个不一样的是1。两个0也是0

三,取反运算(~)

$$(3)_{10}=(011)_2$$

$$取反后就是(100)_2=4$$

取反运算还有一个特殊的值,就是a=-1;

$$a的二进制数是(11111111…)_2$$

$$如果取反的话就是变成(0000…)_2$$

四,移位运算

1,<<(左移运算符)

$$3=(0000011)_2$$

<<1左移一位$$(0000110)_2这是高位溢出用人话讲就是去掉高位$$

2,右移运算符(>>)

$$>>1的情况就是(0000001)_2$$

五,异或运算的公式

$$a \oplus b=b \oplus a(交换律)$$

$$(a\oplus b)\oplus c = a\oplus(b\oplus c)(结合律)$$

$$a\oplus0 = a$$

$$a\oplus a = 0$$

a+b = 2(a&b)+a$\oplus$b 就有a+b>=a$\oplus$b

例题求二进制中1的个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int N = 2e5 + 10;



int main() {

ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

int n;

cin >> n;

while (n--) {

ll cnt = 0;

ll a = 0;

cin >> a;

while (a) {//判断的主体部分

if (a & 1) cnt++;//看最后一位的是否是1

a >>= 1;//判断完就右移去掉

}

cout << cnt << ' ';

}

}

我们需要0

1
2
3
题干:给定一个大小为n的非负整数数组a。  

你可以选定一个非负整数x,并令bi​=ai​⊕x,其中1≤i≤n,请问是否存在x,使得b1​⊕b2​⊕⋅⋅⋅⊕bn​=0

思路分析:要用到两个公式$a\bigoplus a=0$ $a\bigoplus 0 =a$我们可以将bi写成ai和x的表达式$$a_1\bigoplus a_2\bigoplus a_3 \bigoplus x\bigoplus x\bigoplus x = 0$$

x可以删去$$a_1\bigoplus a_2\bigoplus a_3\bigoplus x = 0$$

然后两边都是处理$\bigoplus x$就会有以下的式子$$a_1\bigoplus a_2\bigoplus a_3 = x$$

以下就是代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

int main() {

ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

int t;

cin >> t;

while (t--) {

int n;

cin >> n;

ll ans = 0;

for (int i = 1; i <= n; i++) {

int a = 0;

cin >> a;

ans ^= a;

}

if (ans)

cout << ans << '\n';

else

cout << "-1" << '\n';

}

}

位运算(最好提前看一下逻辑运算符)
https://ljw030710.github.io/2023/09/24/位运算-最好提前看一下逻辑运算符/
Author
iolzyy
Posted on
September 24, 2023
Licensed under