逻辑运算&位运算

今天有人问我,逻辑运算是什么,现在来解释一下
逻辑运算就是相当于信息竞赛基础工具中的一位的位运算


符号对应关系:
(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. 原码:就是原来的数(无符号)
  2. 反码:(符号:~)
    1. 原码除符号位的每一位取反(原码为负)
    1. 原码(原码为正)
  3. 补码:(符号:-)
    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))

原文地址:https://www.cnblogs.com/Wuzhuoming-sirenboke/p/13778320.html