day14.邏輯運算,位運算
邏輯運算,位運算
之前給大家講了算術運算子,賦值運算子和關係運算子,那今天我們來講邏輯運算子,位運算子和條件運算子
先進入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
這個要很牢的記在心裡,因為很多底層演算法都需要用到位運算,位運算的好處就效率高,它是直接跟底層打交道的,直接用二進位制進行計算的
相關文章
- Python邏輯運算Python
- 列舉位邏輯運算從懵懂到似懂非懂
- MySQL的四種運算子(算術運算子、比較運算子、邏輯運算子和位運算子)MySql
- Sympy玩轉邏輯符號運算符號
- 二進位制、位運算、位移運算
- 位運算
- 使用位運算進行加法運算
- 位運算 --20240310
- 理解位運算
- 對位運算與邏輯電路統一性的淺顯理解
- python學習----誰在說謊邏輯運算Python
- web前端學習教程,掌握核心邏輯運算Web前端
- mysql注入方法邏輯運算及常用函式MySql函式
- 計算機最基礎的部分:運算邏輯電路(ALU)計算機
- Java基礎09:邏輯運算子、位運算子Java
- 【SSLOJ 3348】位運算
- 位運算-異或(^)
- 位運算總結
- 學習位運算
- 位運算進階
- PHP 位運算使用PHP
- 位運算小結
- 巧用JS位運算JS
- 好程式設計師web前端分享邏輯運算程式設計師Web前端
- 二、python的邏輯運算與資料型別Python資料型別
- 計算機基礎:位運算計算機
- java二進位制運算十進位制(精確運算)Java
- 8.Golang中的運算子-算術運算子、關係運算子、邏輯運算子、賦值運算子Golang賦值
- C語言基礎-1、邏輯型別和運算C語言型別
- java程式碼執行字串中的邏輯運算方法Java字串
- C語言位運算C語言
- 位運算子的計算
- 神奇的位非運算
- JS中的位運算JS
- 位運算的應用
- 位運算簡單操作
- Java位運算小節Java
- Java中的位運算Java