之前一直忽略的就是所有語言中關於位操作,覺得用處並不多,可能用到也非常簡單的用法,但是其實一直忽略的是它們的用處還是非常大的,下面先回顧一下位操作符的基礎
與操作:&
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超級會員,藍鑽使用者,黃鑽使用者,紅鑽使用者....
我們通常的想法可能是如果資料庫中儲存自己會給使用者存這個字段表示這個使用者開通了哪些特權
我們在**中的寫法可能也是如下所示:
1package main23
import (
4 "fmt"5)
67type users struct
1617
func setvip(user users) users
2122
func isvip(user users) else 28}
2930
func binarytest()
3839
func main()
1package main23
import (
4 "fmt"5)
67type users struct
1112 //這裡通過位移的方式預設00000 從左邊一次為vip,svip,blue,red,yellow
13const (
14 vip = 1
15 svip = (1 << 1)
16 blue = (1 << 2)
17 red = (1 << 3)
18 yello = (1 << 4)19)
2021 //setflag 用於設定使用者開通了哪些特權
22func setflag(user users, isset bool, typeflag uint8) users else
28return user29}
3031 //isflag 用於判斷使用者是否開通某項特權
32func isflag(user users, typeflag uint8) bool
3637
func binarytest()
5657
func main()
上面**就是一種位運算一種非常巧妙的用法,當新新增各種特權的時候只需要在最開始定義的常亮那裡新增一行**即可,就可以直接實現對這種特權的設定和取消,以及檢視是否開通。
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...
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...
你所不知道的 const
const 常量是不可修改的,也就是說only read,例如 const int nbuffsize 512 nbuffsize 0 error就是因為const 常量不能修改,所以定義時必須初始化預設在全域性作用域中定義的非const變數可以在整個程式中訪問,例如 int ncounter ex...