day14.邏輯運算,位運算

時冷發表於2020-12-09

邏輯運算,位運算

之前給大家講了算術運算子,賦值運算子和關係運算子,那今天我們來講邏輯運算子,位運算子和條件運算子

先進入IDEA建立一個Demo05,寫個main方法,我們先從邏輯運算子來看,

邏輯運算裡有三總操作:與或非,之前跟大家講過,

:就是你和我,都要(and &)

:就是你或者我,(or ||)

:就是不是你就是我(取反 !)

我們先定義兩個布林值,一個是一個否,然後分別用與或非分別輸出三次,

先寫出sout,雙引號,a加兩個&符號,這是的輸出格式,往下複製三行,同理把寫出來,的話將與的格式加上感嘆號括號的行,如下

在這裡插入圖片描述

然後我們通過字串來把它們拼接起來,在最後面的引號加上冒號,引號後面寫加號括號,再寫上那個格式,說那麼多也講不清楚,直接看圖

在這裡插入圖片描述

然後我們來輸出一下,通過結果給大家求出一些分支,我們來看

在這裡插入圖片描述

邏輯運算

邏輯與運算:兩個變數都為真,結果為true

只有變數都是為true,才會輸出為true,有一個false就會輸出false,都是false也會輸出false

只要全是true,就會true,有一個false,就會輸出false

邏輯或運算:兩個變數一個為真,則結果才為true

兩個變數有一個true,就輸出true,兩個都是true,還是輸出true,都是false,才會輸出false

只要有true,就會輸出true,沒true就輸出false

邏輯非運算

邏輯非運算:如果是真,則變為假,如果是假,則變為真

都是true,輸出為false,都是false,輸出為true,

輸出出來的結果是相反的,就可以理解為負負得正,

那有人想問了,我三個布林值得出來的結果是false還是true呢

打個比方a是true,b是false,c是false,d是true,然後我們分別輸出兩個程式碼,一個輸出a,b,c,一個輸出a,b,d,得出來的結果都是false

在這裡插入圖片描述

這是為什麼呢,聯想一下初中學的負負得正,同數相乘得正,異數相乘得負,把正數當成true,負數當成false,正數乘以負數再乘以正數得出來的結果為負數,

2乘以**-2**乘以2=負8, true+false+true等於false

負2乘以2乘以負2=負8 false+true+false等於false

得出的結果為負數,false,又因為結果是取反的所以輸出為true,用這樣的邏輯是不是很好理解,

短路運算

除了這些,還有個東西叫短路運算,在邏輯與運算是兩個都為真才會輸出true,假設如果b和a的位置調換了,

在這裡插入圖片描述

程式先檢測到d是假的,那就不會計算後面的東西了,這就短路了,b為假就直接輸出false了,後面的東西就沒有任何意義了

那有人問了,你怎麼知道他不會計算後面的東西了,那我們做個試驗證明一下

先int c一個5,再設個布林值d等於c<4,但是這樣它就世界輸出false,

我們再往後加個&&,讓他和c++<10進行比較,再輸出c和d,

在這裡插入圖片描述

得出的結果可以看到為false,這是毫無疑問的,但是c輸出的5,並沒有變成6,如果c++執行了,那這個5是不是應該+1呀,

可是它沒有,這就證明了檢測到false就不會執行後面的東西

這就是與或非的邏輯運算,接下來就要講位運算了

位運算

**位運算:& ,| ,^ ,~ ,>> ,<< ,>>> **

由於位運算它是由一套面試題,所以給大家詳細講解

先建立一個新的class檔案,名為Demo06,寫個main方法,先寫個註釋

A = 0011 1100 / B = 0000 1101,這是兩個八位二級制

我們先注意位運算的前三個:&,|,^,這三個和邏輯運算的與或非是一樣的,但它是單個,所以不要輕易的去用位運算,

我們先看看什麼意思

A&B (A與B):跟邏輯與運算很像,它是兩排8個數字一個一個比較,只有兩個一才得一,01,00都算0

如果對應位都是0,它就是0,對應位1個1,1個0,它還是0,對應為兩個1,那它就是1
在這裡插入圖片描述

得出的結果是:0000 1100,它是根據位來算的

A|B(A或B):跟邏輯或運算很像,跟上同理,

如果對應位都是0,那就是0,如果是1個1,1個0,那它就是1,如果對應位都是1,那它還是1

在這裡插入圖片描述

得出的結果是:0011 1101,

A^B(異或):AB兩者位相同則為0,不同則為1

如果上下都是0,則為0,上下1個1,1個0,那就是1,上下都是1,那還是0

在這裡插入圖片描述

A~B(取反):跟邏輯非運算很像,是相反的,

你0它就1,你是0000,它就是1111

這些大家應該瞭解吧,接下來引出一道面試題,2*8怎麼運算最快,大家都知道是16,但是計算機不知道,它要在底層做非常多的運算,2X2X2X2,這樣很麻煩

這時候看到上面的:>> << 這兩個符號,叫左移右移,箭頭指那邊就往那邊移,

這時候我們輸出一下,2左移三位,看看結果會不會等於16

在這裡插入圖片描述

可以看到結果是16,而為運算最神奇的地方在這裡

我們的數字字母符號都是由最根本的二進位制,就比如說0在二進位制就是代表0000 0000,一的話是0000 0001,二就是0000 0010,如下:

在這裡插入圖片描述

而左移右移的意思呢,就是把1往右或者左移一位,看圖,8要跳到16,就是左移一位,就是我們剛才輸出的,是同一個意思,同理,8想變成4,最快的方法就是往右移一位

左移就相當於把數字乘以2,右移就相當於把數字除以2

這個要很牢的記在心裡,因為很多底層演算法都需要用到位運算,位運算的好處就效率高,它是直接跟底層打交道的,直接用二進位制進行計算的

相關文章