之前一直忽略的就是所有語言中關於位操作,覺得用處並不多,可能用到也非常簡單的用法,但是其實一直忽略的是它們的用處還是非常大的,下面先回顧一下位操作符的基礎
與操作:&
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超級會員,藍鑽使用者,黃鑽使用者,紅鑽使用者....
我們通常的想法可能是如果資料庫中儲存自己會給使用者存這個字段表示這個使用者開通了哪些特權
我們在**中的寫法可能也是如下所示:
1 package main2 3 import (
4 "fmt"
5 )6 7 type users struct
16 17 func setvip(user users) users
21 22 func isvip(user users) else
28 }
29 30 func binarytest()
38 39 func main()
1 package main上面**就是一種位運算一種非常巧妙的用法,當新新增各種特權的時候只需要在最開始定義的常亮那裡新增一行**即可,就可以直接實現對這種特權的設定和取消,以及檢視是否開通。2 3 import (
4 "fmt"
5 )6 7 type users struct
11 12 // 這裡通過位移的方式預設00000 從左邊一次為vip,svip,blue,red,yellow
13 const (
14 vip = 1
15 svip = (1 << 1)
16 blue = (1 << 2)
17 red = (1 << 3)
18 yello = (1 << 4)
19 )
20 21 // setflag 用於設定使用者開通了哪些特權
22 func setflag(user users, isset bool, typeflag uint8) users else
28 return user
29 }
30 31 //isflag 用於判斷使用者是否開通某項特權
32 func isflag(user users, typeflag uint8) bool
36 37 func binarytest()
56 57 func main()
**:之前一直忽略的就是所有語言中關於位操作,覺得用處並不多,可能用到也非常簡單的用法,但是其實一直忽略的是它們的用處還是非常大的,下面先回顧一下位操作符的基礎
與操作:&
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超級會員,藍鑽使用者,黃鑽使用者,紅鑽使用者....
我們通常的想法可能是如果資料庫中儲存自己會給使用者存這個字段表示這個使用者開通了哪些特權
我們在**中的寫法可能也是如下所示:
1 package main2 3 import (
4 "fmt"
5 )6 7 type users struct
16 17 func setvip(user users) users
21 22 func isvip(user users) else
28 }
29 30 func binarytest()
38 39 func main()
1 package main上面**就是一種位運算一種非常巧妙的用法,當新新增各種特權的時候只需要在最開始定義的常亮那裡新增一行**即可,就可以直接實現對這種特權的設定和取消,以及檢視是否開通。2 3 import (
4 "fmt"
5 )6 7 type users struct
11 12 // 這裡通過位移的方式預設00000 從左邊一次為vip,svip,blue,red,yellow
13 const (
14 vip = 1
15 svip = (1 << 1)
16 blue = (1 << 2)
17 red = (1 << 3)
18 yello = (1 << 4)
19 )
20 21 // setflag 用於設定使用者開通了哪些特權
22 func setflag(user users, isset bool, typeflag uint8) users else
28 return user
29 }
30 31 //isflag 用於判斷使用者是否開通某項特權
32 func isflag(user users, typeflag uint8) bool
36 37 func binarytest()
56 57 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...