前言
因?yàn)橹耙恢焙雎缘木褪撬姓Z(yǔ)言中關(guān)于位操作,覺(jué)得用處并不多,可能用到也非常簡(jiǎn)單的用法,但是其實(shí)一直忽略的是它們的用處還是非常大的,下面先回顧一下位操作符的基礎(chǔ)
位操作符
與操作:
1 1 = 1
1 0 = 0
0 1 = 0
0 0 = 0
或操作:!
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 0 = 0
異或:^
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
左移:
1 10 = 1024
1 20 = 1M
1 30 = 1G
右移:>>
1024 >> 10 = 1
1024 >>1 = 512
1024 >>2 = 256
關(guān)于上述知識(shí)的一個(gè)應(yīng)用實(shí)例
可能這個(gè)例子在實(shí)際中用并不是特別嚴(yán)謹(jǐn),但是也提供了我們寫(xiě)代碼的一種思路
這里拿微博或者qq用戶的特權(quán)為例子:
一個(gè)qq號(hào)可以用VIP會(huì)員,SVIP超級(jí)會(huì)員,藍(lán)鉆用戶,黃鉆用戶,紅鉆用戶....
我們通常的想法可能是如果數(shù)據(jù)庫(kù)中存儲(chǔ)自己會(huì)給用戶存這個(gè)字段表示這個(gè)用戶開(kāi)通了哪些特權(quán)
我們?cè)诖a中的寫(xiě)法可能也是如下所示:
package main import ( "fmt" ) type users struct { name string flag uint8 vip bool svip bool blue bool red bool yellow bool } func setVip(user users) users { user.vip = true return user } func isVip(user users) { if user.vip { fmt.Println("user is vip") } else { fmt.Println("user is not vip") } } func binaryTest() { var user users user.name = "test01" user.vip = true isVip(user) user.vip = false isVip(user) } func main() { binaryTest() }
這種實(shí)現(xiàn)方式也可以,但是明顯我們需要為每個(gè)類型都做操作,并且如果以后又有更多的各種各樣的會(huì)員和鉆有需要添加新的,所以并不是最佳方法,下面我們通過(guò)位操作來(lái)實(shí)現(xiàn)上述的功能,代碼如下:
package main import ( "fmt" ) type users struct { name string flag uint8 } // 這里通過(guò)位移的方式默認(rèn)00000 從左邊一次為vip,svip,blue,red,yellow const ( vip = 1 svip = (1 1) blue = (1 2) red = (1 3) yello = (1 4) ) // setFlag 用于設(shè)置用戶開(kāi)通了哪些特權(quán) func setFlag(user users, isSet bool, typeFlag uint8) users { if isSet == true { user.flag = user.flag | typeFlag } else { user.flag = user.flag ^ typeFlag } return user } //isFlag 用于判斷用戶是否開(kāi)通某項(xiàng)特權(quán) func isFlag(user users, typeFlag uint8) bool { result := user.flag typeFlag return result == typeFlag } func binaryTest() { var user users user.name = "coder" user.flag = 0 //判斷用戶是否是vip result := isFlag(user, vip) fmt.Printf("user is Vip:%t\n", result) //給用戶開(kāi)通vip,并看用戶是否開(kāi)通vip user = setFlag(user, true, vip) result = isFlag(user, vip) fmt.Printf("user is Vip:%t\n", result) //取消用戶的vip,并查看用戶是否還是vip user = setFlag(user, false, vip) result = isFlag(user, vip) fmt.Printf("user is Vip:%t\n", result) } func main() { binaryTest() }
上面代碼就是一種位運(yùn)算一種非常巧妙的用法,當(dāng)新添加各種特權(quán)的時(shí)候只需要在最開(kāi)始定義的常亮那里添加一行代碼即可,就可以直接實(shí)現(xiàn)對(duì)這種特權(quán)的設(shè)置和取消,以及查看是否開(kāi)通。
附常見(jiàn)的>>右移 左移 感覺(jué)右移左移應(yīng)該也是非常常見(jiàn)的使用了
繼續(xù)看例子:
package main import "fmt" func main() { x := 2 y := 4 fmt.Println(x1) fmt.Println(y>>1) }output:4 2
進(jìn)行轉(zhuǎn)化為二進(jìn)制 然后向左或者向右移動(dòng)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
標(biāo)簽:阿壩 泰安 瀘州 滄州 駐馬店 晉中 東營(yíng) 昭通
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go語(yǔ)言中你所不知道的位操作用法》,本文關(guān)鍵詞 語(yǔ),言中,你所,不知道,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。