Golang 運(yùn)算符及位運(yùn)算詳解
什么是運(yùn)算符?
運(yùn)算符用于執(zhí)行程序代碼運(yùn)算,會(huì)針對一個(gè)以上操作數(shù)項(xiàng)目來進(jìn)行運(yùn)算。例如:2+3,其操作數(shù)是2和3,而運(yùn)算符則是“+”。
在vb2005中運(yùn)算符大致可以分為5種類型:算術(shù)運(yùn)算符、位運(yùn)算符、 關(guān)系運(yùn)算符、賦值運(yùn)算符、邏輯運(yùn)算符。
算數(shù)運(yùn)算符
運(yùn)算符 | 描述 |
---|---|
+ | 相加 |
- | 相減 |
* | 相乘 |
/ | 相除 |
% | 求余 |
注意: ++(自增)和--(自減)在Go語言中是單獨(dú)的語句,并不是運(yùn)算符。
func main() { a, b := 3,4 fmt.Printf("a 加 b = %d\n", a + b) fmt.Printf("a 減 b = %d\n", a - b) fmt.Printf("a 乘 b = %d\n", a * b) fmt.Printf("a 除 b = %d\n", a / b) }
關(guān)系運(yùn)算符
運(yùn)算符 | 描述 |
---|---|
== | 檢查兩個(gè)值是否相等,如果相等返回 True 否則返回 False。 |
!= | 檢查兩個(gè)值是否不相等,如果不相等返回 True 否則返回 False。 |
> | 檢查左邊值是否大于右邊值,如果是返回 True 否則返回 False。 |
>= | 檢查左邊值是否大于等于右邊值,如果是返回 True 否則返回 False。 |
< | 檢查左邊值是否小于右邊值,如果是返回 True 否則返回 False。 |
<= | 檢查左邊值是否小于等于右邊值,如果是返回 True 否則返回 False。 |
package main import "fmt" func main() { a, b := 3, 4 //fmt.Println("a == b?", a == b) // a == b? false //fmt.Println("a != b?", a != b) // a != b? true //fmt.Println("a > b?", a > b ) // a > b? true //fmt.Println("a >= b?", a >= b) // a >= b? false //fmt.Println("a < b?", a < b ) // a >= b? true //fmt.Println("a <= b?", a <= b ) // a <= b? true }
邏輯運(yùn)算符
運(yùn)算符 | 描述 |
---|---|
&& | 邏輯 AND 運(yùn)算符。 如果兩邊的操作數(shù)都是 True,則為 True,否則為 False。 |
|| | 邏輯 OR 運(yùn)算符。 如果兩邊的操作數(shù)有一個(gè) True,則為 True,否則為 False。 |
! | 邏輯 NOT 運(yùn)算符。 如果條件為 True,則為 False,否則為 True。 |
package main import "fmt" func main() { a, b := true, false fmt.Println("a && b ?", a && b) // a && b ? false fmt.Println("a || b ?", a || b) // a || b ? true fmt.Println(" !a ?", !a) // !a ? false fmt.Println(" !b ?", !b) // !b ? true }
位運(yùn)算符
常見進(jìn)制:
二進(jìn)制:只有 0 和 1,Go語言中不能直接使用二進(jìn)制表示整數(shù);
八進(jìn)制:0-7,以數(shù)字 0 開頭;
十進(jìn)制:0-9;
十六進(jìn)制:0-9 以及 A-F,以 0X 開頭,A-F 以及 X 不區(qū)分大小寫。
package main import "fmt" func main() { a := 10 // 二進(jìn)制 fmt.Printf("%b\n",a) // 1010 // 八進(jìn)制 fmt.Printf("%o\n",a) // 12 // 十進(jìn)制 fmt.Printf("%d\n",a) // 10 // 十六進(jìn)制 fmt.Printf("%x\n",a) // a }
任意進(jìn)制轉(zhuǎn)換為十進(jìn)制
二進(jìn)制轉(zhuǎn)十進(jìn)制:從最低位開始,每個(gè)位上數(shù)乘以 2 的位數(shù)減 1 次方然后求和。
1011 = 120 + 121 + 022 + 123 = 11
八進(jìn)制轉(zhuǎn)十進(jìn)制:從最低位開始,每個(gè)位上數(shù)乘以 8 的位數(shù)減 1 次方然后求和。
0123 = 380 + 281 + 182 + 083 = 83
其他進(jìn)制互轉(zhuǎn):
二進(jìn)制轉(zhuǎn)換八進(jìn)制:將二進(jìn)制數(shù)從低位開始,每三位一組,轉(zhuǎn)換成八進(jìn)制數(shù)即可;
二進(jìn)制轉(zhuǎn)十六進(jìn)制:將二進(jìn)制數(shù)從低位開始,每四位一組,轉(zhuǎn)換成十六進(jìn)制數(shù)即可;
八進(jìn)制轉(zhuǎn)換二進(jìn)制:將八進(jìn)制數(shù)每 1 位轉(zhuǎn)換成一個(gè) 3 位的二進(jìn)制數(shù)(首位 0 除外);
十六進(jìn)制轉(zhuǎn)二進(jìn)制:將十六進(jìn)制每 1 位轉(zhuǎn)換成對應(yīng)的一個(gè) 4 位的二進(jìn)制數(shù)即可。
反碼補(bǔ)碼
對于有符號(hào)數(shù)而言,二進(jìn)制的最高為是符號(hào)位:0 表示正數(shù),1 表示負(fù)數(shù)。
短除法進(jìn)行進(jìn)制轉(zhuǎn)變
十進(jìn)制的10-> 二進(jìn)制:
二進(jìn)制的1011 -> 十進(jìn)制
想要詳細(xì)了解其原理的可以參考短除法相關(guān)說明
位運(yùn)算符對整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作。
運(yùn)算符 | 描述 |
---|---|
& | 參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相與。 (兩位均為1才為1) |
| | 參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相或。 (兩位有一個(gè)為1就為1) |
^ | 參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相異或,當(dāng)兩對應(yīng)的二進(jìn)位相異時(shí),結(jié)果為1。 (兩位不一樣則為1) |
<< | 左移n位就是乘以2的n次方。 “a<<b”是把a(bǔ)的各二進(jìn)位全部左移b位,高位丟棄,低位補(bǔ)0。 |
>> | 右移n位就是除以2的n次方。 “a>>b”是把a(bǔ)的各二進(jìn)位全部右移b位。 |
XOR - 異或:相同為0,不同為1.也可用“進(jìn)位加法”來理解
x ^ 0 = X x ^ 1s = ~x # 1s = ~ 0 x ^ (~x) = 1s x ^ x = 0 c = a ^ b => a ^ c = b, b ^c = a # 交換兩數(shù) a ^ b ^ c = a ^(b ^ c) = (a ^ b) ^c # associative // 指定未知的位運(yùn)算 . 將x最右邊的n位請零: x & (~0 << n ) . 獲取x的第n位值(0 或 1): (x >> n)& 1 . 獲取x的第n位的冪值:x & (1 << n) . 僅將第n位置為 1: x | (1 << n) . 僅將第n位置為0:x & (~1(1 << n)) . 將x最高位至第n位(含)清零:x & ((1 << n) - 1) // 實(shí)戰(zhàn)位運(yùn)算要點(diǎn) // 判斷奇偶性 x % 2 == 1 - > (x & 1) == 1 x & 2 == 0 -> (x&1) == 0 // 清零最低位的1 x = x & (x - 1) // 得到最低位的1 x & ~x x & ~ x = > 0
為了更清晰的觀察其變化,我們使用二進(jìn)制來進(jìn)行演示
package main import "fmt" func main() { a, b := 13, 21 fmt.Printf("a:%b & %b = %b\n", a, b, a & b) fmt.Printf("a:%b | %b = %b\n", a, b, a | b) fmt.Printf("a:%b ^ %b = %b\n", a, b, a ^ b) fmt.Printf("a:%b ^ %b = %b\n", a, b, a ^ b) // 左移 // 二進(jìn)制表示 fmt.Printf("%b << %b = %b\n",2, 2, 2<<2) // 10 << 10 = 1000 // 十進(jìn)制 fmt.Printf("%d << %d = %d\n",2, 2, 2<<2) // 2 << 2 = 8 // 右移 // 二進(jìn)制 fmt.Printf("%b >> %b = %b\n",2, 2, 2>>2) // 10 >> 10 = 0 // 十進(jìn)制 fmt.Printf("%d >> %d = %d\n",2, 2, 2>>2) // 2 >> 2 = 0 }
賦值運(yùn)算符
運(yùn)算符 | 描述 |
---|---|
= | 簡單的賦值運(yùn)算符,將一個(gè)表達(dá)式的值賦給一個(gè)左值 |
+= | 相加后再賦值 |
-= | 相減后再賦值 |
*= | 相乘后再賦值 |
/= | 相除后再賦值 |
%= | 求余后再賦值 |
<<= | 左移后賦值 |
>>= | 右移后賦值 |
&= | 按位與后賦值 |
|= | 按位或后賦值 |
^= | 按位異或后賦值 |
運(yùn)算符優(yōu)先級(jí)
運(yùn)算符優(yōu)先級(jí)確定表達(dá)式中的分組。這會(huì)影響表達(dá)式的計(jì)算方式。某些運(yùn)算符比其他運(yùn)算符具有更高的優(yōu)先級(jí); 例如,乘法運(yùn)算符比加法運(yùn)算符有更高的優(yōu)先級(jí)。
當(dāng)同級(jí)別的運(yùn)算符出現(xiàn)在同一個(gè)表達(dá)式中,從左到右的順序計(jì)算,比如乘除一起,不管是乘在前面還是除在前面都是從左到右計(jì)算乘、除運(yùn)算符。加減亦是如此。
例如:x = 7 + 3 * 2; 這里,計(jì)算結(jié)果x被分配13,而不是20,因?yàn)檫\(yùn)算符 *具有比+有更的優(yōu)先級(jí),所以它首先乘以3 * 2,然后加上7。
這里,具有最高優(yōu)先級(jí)的運(yùn)算符放在表的頂部,具有最低優(yōu)先級(jí)的運(yùn)算符出現(xiàn)在底部。 在表達(dá)式中,將首先計(jì)算較高優(yōu)先級(jí)運(yùn)算符。
分類 | 描述 | 關(guān)聯(lián)性 |
---|---|---|
后綴 | ()[]->.++ – | 左到右 |
一元 | + -!~++ --(type)*&sizeof | 右到左 |
乘法 | */ % | 左到右 |
加法 | + - | 左到右 |
移位 | <<>> | 左到右 |
關(guān)系 | <<=>>= | 左到右 |
相等 | ==!= | 左到右 |
按位AND | & | 左到右 |
按位XOR | ^ | 左到右 |
按位OR | | | 左到右 |
邏輯AND | && | 左到右 |
邏輯OR | || | 左到右 |
條件 | ?: | 右到左 |
分配 | =+=-=*=/= %=>>= <<= &= ^= |= | 右到左 |
逗號(hào) | , | 左到右 |
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Go語言的Windows下環(huán)境配置以及簡單的程序結(jié)構(gòu)講解
這篇文章主要介紹了Go語言的Windows下環(huán)境配置以及簡單的程序結(jié)構(gòu)講解,從編程語言約定俗成的hellow world開始,需要的朋友可以參考下2015-10-10通過手機(jī)案例理解Go設(shè)計(jì)模式之裝飾器模式的功能屬性
這篇文章主要為大家介紹了Go設(shè)計(jì)模式之裝飾器模式的功能屬性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05gorm整合進(jìn)go-zero的實(shí)現(xiàn)方法
go-zero提供的代碼生成器里面,沒有提供orm框架操作,但是提供了遍歷的緩存操作,所以可以利用gorm當(dāng)作一個(gè)sql語句的生成器,把生成后的sql語句放到go-zero生成的模板中去執(zhí)行,對gorm整合進(jìn)go-zero的實(shí)現(xiàn)方法感興趣的朋友一起看看吧2022-03-03Go語言的變量、函數(shù)、Socks5代理服務(wù)器示例詳解
這篇文章主要介紹了Go語言的變量、函數(shù)、Socks5代理服務(wù)器的相關(guān)資料,需要的朋友可以參考下2017-09-09Go語言web快速開發(fā)框架Gin的HttpRouter路由的使用
in框架內(nèi)部使用了高性能的路由器庫httprouter,支持動(dòng)態(tài)參數(shù)匹配和簡潔的接口,本文主要介紹了Go語言web快速開發(fā)框架Gin的HttpRouter路由的使用,感興趣的可以了解一下2025-03-03