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

2021-09-07 16:05:53 字數 1675 閱讀 5694

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

與操作:&

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 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()

1

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