日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go 语言系列 (四)位操作用法

發布時間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go 语言系列 (四)位操作用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Go基礎之--位操作中你所不知道的用法

?

之前一直忽略的就是所有語言中關于位操作,覺得用處并不多,可能用到也非常簡單的用法,但是其實一直忽略的是它們的用處還是非常大的,下面先回顧一下位操作符的基礎

位操作符

與操作:& 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

?

?

關于上述知識的一個應用實例

可能這個例子在實際中用并不是特別嚴謹,但是也提供了我們寫代碼的一種思路

這里拿微博或者qq用戶的特權為例子:
一個qq號可以用VIP會員,SVIP超級會員,藍鉆用戶,黃鉆用戶,紅鉆用戶....
我們通常的想法可能是如果數據庫中存儲自己會給用戶存這個字段表示這個用戶開通了哪些特權
我們在代碼中的寫法可能也是如下所示:

package mainimport ("fmt" )type users struct {name stringflag uint8vip boolsvip boolblue boolred boolyellow bool }func setVip(user users) users {user.vip = truereturn user }func isVip(user users) {if user.vip {fmt.Println("user is vip")} else {fmt.Println("user is not vip")} }func binaryTest() {var user usersuser.name = "test01"user.vip = trueisVip(user)user.vip = falseisVip(user) }func main() {binaryTest()}

?

這種實現方式也可以,但是明顯我們需要為每個類型都做操作,并且如果以后又有更多的各種各樣的會員和鉆有需要添加新的,所以并不是最佳方法,下面我們通過位操作來實現上述的功能,代碼如下:

package mainimport ("fmt" )type users struct {name stringflag uint8 }// 這里通過位移的方式默認00000 從左邊一次為vip,svip,blue,red,yellow const (vip = 1svip = (1 << 1)blue = (1 << 2)red = (1 << 3)yello = (1 << 4) )// setFlag 用于設置用戶開通了哪些特權 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 用于判斷用戶是否開通某項特權 func isFlag(user users, typeFlag uint8) bool {result := user.flag & typeFlagreturn result == typeFlag }func binaryTest() {var user usersuser.name = "coder"user.flag = 0//判斷用戶是否是vipresult := isFlag(user, vip)fmt.Printf("user is Vip:%t\n", result)//給用戶開通vip,并看用戶是否開通vipuser = setFlag(user, true, vip)result = isFlag(user, vip)fmt.Printf("user is Vip:%t\n", result)//取消用戶的vip,并查看用戶是否還是vipuser = setFlag(user, false, vip)result = isFlag(user, vip)fmt.Printf("user is Vip:%t\n", result) }func main() {binaryTest() }

?

上面代碼就是一種位運算一種非常巧妙的用法,當新添加各種特權的時候只需要在最開始定義的常亮那里添加一行代碼即可,就可以直接實現對這種特權的設置和取消,以及查看是否開通。

?

轉載于:https://www.cnblogs.com/flying1819/articles/8832272.html

總結

以上是生活随笔為你收集整理的go 语言系列 (四)位操作用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。