今天有人問我,邏輯運算是什麼,現在來解釋一下
邏輯運算就是相當於資訊競賽基礎工具中的一位的位運算
符號對應關係:
\(\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<\((10110)_2\)時,k=1,那麼x<\((101100)_2\),k=2,那麼x<\((1011000)_2\))
先來看看一位的位運算:
現有兩個bool型a,b
not a
a=10
a=01
a and b
a or b
a xor b
a=1,b=111
0a=1,b=001
1a=0,b=101
1a=0,b=000
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\)
\(\therefore (00000100)_2=(10101100)_2 \& ((01010011)_2+1)=(10101100)_2 \& (01010100)_2\)
\(\therefore lowbit(x)=x\&(-x)\)
邏輯位運算與邏輯運算
兩者非常容易混淆,其實這是截然不同的兩種運算.1.邏輯位運算 與運算 1 2 0 0000 0001 0000 0010 0000 0000 0 或運算 1 2 3 0000 0001 0000 0010 0000 0011 3 按位求反 運算,異或 運算略.移位 左移,右移 運算略.2.邏輯運算 ...
C 邏輯運算 位運算
c gossip 邏輯運算 位運算 一 邏輯運算 在邏輯上有所謂的 且 或 與 反 運算,在c 中也提供這幾個基本邏輯運算所需的 邏輯運算子 logical operator 分別為 且 或 及 反相 三個運算子。來看看下面這個程式會輸出什麼?int num 75 cout num 70 num 8...
邏輯運算和位運算
本文主要針對的是邏輯運算 和位運算 關於移位預算,現在對開發來說基本不用,就不說了。邏輯運算主要是針對多個boolean表示式來說的,即a 1 b 2這種,就是說邏輯運算子左右都是boolean型別的表示式,這裡!是個特例,它是一元運算子,只對右邊boolean表示式取反,即!ture 變成了fal...