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

2022-08-30 08:18:11 字數 3393 閱讀 9140

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

與操作:&

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 main

2 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 main

2 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...