邏輯運算 位運算

2022-08-21 13:36:09 字數 1684 閱讀 5999

今天有人問我,邏輯運算是什麼,現在來解釋一下

邏輯運算就是相當於資訊競賽基礎工具中的一位的位運算

符號對應關係:

\(\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...