Live2D

逻辑运算&位运算

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


符号对应关系:
\(\wedge\)=\(\cap\)(交)=&=and=与运算
\(\vee\)=\(\cup\)(并)=|=or=或运算
\(\neg\)=~=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\)
\(\therefore (00000100)_2=(10101100)_2 \& ((01010011)_2+1)=(10101100)_2 \& (01010100)_2\)
\(\therefore lowbit(x)=x\&(-x)\)

posted @ 2020-10-07 20:41  Wuzhouming  阅读(785)  评论(0编辑  收藏  举报