前言:
歎時間總是那麼滴不夠,離上次發本系列文章又很久了,由於總總原因,到現在才更新,唉,不多說了,今天繼續我們的Golang......
Go語言中的運算子
上述表格(引自網路)已經很清楚的展示了Go語言的運算子已經它們的優先順序,對於非常常見的這裡就不一一介紹了,這裡舉幾個運算子來玩玩。
先看一例子:題目--給定一個int型數組,找出其中的奇數,列印出來?。大家動手試試,可以選擇上面表格中的任意運算子完成。
這題目很簡單,如果一個數不能被2整除,那麼就是奇數,好,我們試試%運算子,該運算子是模數,也就是說可以取得餘數,那麼如果對2模數,結果不是0,那麼就是奇數了。看代碼:
這裡定義了一個isOdd的方法用來判斷數字是否是奇數,傳回值是bool類型。該方法一個比較常見的錯誤是,有人會誤認為模2後等於1 既 num%2==1則是奇數,但是這是不對的,因為當出現負數的時候,不管是奇數還是偶數都返回false,顯然餘數是負數的話不管如何都不會和1相等。如果你編譯上面的代碼,會發生奇怪的事情。尼瑪,竟然是病毒???雖然明顯是誤判,但是我還是很詫異啊。不知道在你的機子上如何。
其實也沒必要覺得奇怪,殺毒軟體一般都是根據特徵碼來判斷是否是病毒,因此,某個程式編譯出來的應用恰好符合也是很有可能的,因此我們也常常看到殺毒軟體誤殺某某軟體了。要解決這個其實也簡單,有時候只需調整下代碼結構或者內容就可以了,這裡我在列印結果下增加一行換行代碼 fmt.Println()就沒問題了。
除了通過使用%運算子,其實還可以通過&運算子進行判斷奇數。原理就是:
(一)位元運算的時候,我們知道任何奇數的二進位表示最低位都是1,
例如 1 的二進位 0000 0001(為了方便描述,這裡都取8位二進位來表示) ,3的二進位 0000 0011 ,21的二進位 0001 0101 ...
(二)而&運算規則是 1&1 = 1 ,0&0 = 0,0&1=0,1&0=0.總之0&任何數都是0 只有1&1才是1 。
那麼我們就根據(一) (二)便可以拿1 二進位為 0000 0001 與任意數進行&運算,如果與1相&的數字是奇數,則結果高位全部是0,最低位1&1=1 最後是0000 0001。
最後代碼如下:
再來看一個Go語言中特別點的運算子 &^ 表示and not
假設 a &^ b 則該運算會從a上清除所有b的標誌位,這是什麼意思呢?還是看例子:
a : 0000 0000 0010 0011 = 35
b: 0000 0000 1100 0101 = 197
===================
0000 0000 0010 0010 = 34
標誌位這裡是指為1的位,如果你覺得這樣記起來麻煩,其實它是先進行了a ^ b (XOR)運算,然後將結果與b再進行&運算。
可以通過程式驗證結果:
這次就到這裡了,更多操作符的具體用法將會在以後相關知識點用到時再詳細介紹。