位运算(最好提前看一下逻辑运算符)
作用:
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 |
|
我们需要0
1 |
|
思路分析:要用到两个公式$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 |
|
位运算(最好提前看一下逻辑运算符)
https://ljw030710.github.io/2023/09/24/位运算-最好提前看一下逻辑运算符/