今天有人问我,逻辑运算是什么,现在来解释一下
逻辑运算就是相当于信息竞赛基础工具中的一位的位运算
符号对应关系:
(wedge)=(cap)(交)=&=and=与运算
(vee)=(cup)(并)=|=or=或运算
(
eg)=~=not=非
^=xor=异或运算
x>>k=将x的二进制右移k位(如:x=((10110)_2)时,k=1,那么x>>k=((1011)_2),k=2,那么x>>k=((101)_2))
x<<k=将x的二进制左移k位(如:x=((10110)_2)时,k=1,那么x<<k=((101100)_2),k=2,那么x<<k=((1011000)_2))
先来看看一位的位运算:
现有两个bool型a,b
not a | |
---|---|
a=1 | 0 |
a=0 | 1 |
a and b | a or b | a xor b | |
---|---|---|---|
a=1,b=1 | 1 | 1 | 0 |
a=1,b=0 | 0 | 1 | 1 |
a=0,b=1 | 0 | 1 | 1 |
a=0,b=0 | 0 | 0 | 0 |
再来看各种的码(原码,反码,补码)
默认有符号(就是正负符号)
- 原码:就是原来的数(无符号)
- 反码:(符号:~)
1. 原码除符号位的每一位取反(原码为负)
1. 原码(原码为正) - 补码:(符号:-)
1. 反码加1(原码为负)
1. 原码(原码为正)
现在再来看按位与,按位或,按位异或
现在有两个二进制数
a=((1001010011)_2)
b=((0101001010)_2)
那么
a&b=((1001010011)_2)&((0101001010)_2)=((1000000000)_2)&((0000000000)_2)+((000000000)_2)&((100000000)_2)+……+((1)_2)&((0)_2)=((0001000010)_2)
a|b=((1001010011)_2)|((0101001010)_2)=((1000000000)_2)|((0000000000)_2)+((000000000)_2)|((100000000)_2)+……+((1)_2)|((0)_2)=((1101011011)_2)
ab=$(1001010011)_2$((0101001010)_2)=((1000000000)_2)$(0000000000)_2$+$(000000000)_2$((100000000)_2)+……+((1)_2)^((0)_2)=((1100011001)_2)(可以理解为不进位二进制加法)
lowbit运算:(树状数组必用)
因为在补码表示下~x=-x-1
lowbit(x)=x&(~x+1)=x&(-x)
可以找出整数二进制下最后一个是1的位
例:x=((10101100)_2)
则~x=((01010011)_2),-x=((01010100)_2)
( herefore (00000100)_2=(10101100)_2 & ((01010011)_2+1)=(10101100)_2 & (01010100)_2)
( herefore lowbit(x)=x&(-x))