最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言中你所不知道的位操作用法

 更新時(shí)間:2017年12月05日 11:04:14   作者:python修行路  
位運(yùn)算可能在平常的編程中使用的并不多,但涉及到底層優(yōu)化,一些算法及源碼可能會(huì)經(jīng)常遇見(jiàn)。下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中你所不知道的位操作用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。

前言

因?yàn)橹耙恢焙雎缘木褪撬姓Z(yǔ)言中關(guān)于位操作,覺(jué)得用處并不多,可能用到也非常簡(jiǎn)單的用法,但是其實(shí)一直忽略的是它們的用處還是非常大的,下面先回顧一下位操作符的基礎(chǔ)

位操作符

與操作:&

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

關(guān)于上述知識(shí)的一個(gè)應(yīng)用實(shí)例

可能這個(gè)例子在實(shí)際中用并不是特別嚴(yán)謹(jǐn),但是也提供了我們寫(xiě)代碼的一種思路

這里拿微博或者qq用戶的特權(quán)為例子:

一個(gè)qq號(hào)可以用VIP會(huì)員,SVIP超級(jí)會(huì)員,藍(lán)鉆用戶,黃鉆用戶,紅鉆用戶....

我們通常的想法可能是如果數(shù)據(jù)庫(kù)中存儲(chǔ)自己會(huì)給用戶存這個(gè)字段表示這個(gè)用戶開(kāi)通了哪些特權(quán)

我們?cè)诖a中的寫(xiě)法可能也是如下所示:

package main

import (
 "fmt"
)

type users struct {
 name string
 flag uint8
 vip bool
 svip bool
 blue bool
 red bool
 yellow bool
}

func setVip(user users) users {
 user.vip = true
 return user
}

func isVip(user users) {
 if user.vip {
  fmt.Println("user is vip")
 } else {
  fmt.Println("user is not vip")
 }
}

func binaryTest() {
 var user users
 user.name = "test01"
 user.vip = true
 isVip(user)
 user.vip = false
 isVip(user)
}

func main() {
 binaryTest()

}

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

package main

import (
  "fmt"
)

type users struct {
  name string
  flag uint8
}

// 這里通過(guò)位移的方式默認(rèn)00000 從左邊一次為vip,svip,blue,red,yellow
const (
  vip  = 1
  svip = (1 << 1)
  blue = (1 << 2)
  red  = (1 << 3)
  yello = (1 << 4)
)

// setFlag 用于設(shè)置用戶開(kāi)通了哪些特權(quán)
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 用于判斷用戶是否開(kāi)通某項(xiàng)特權(quán)
func isFlag(user users, typeFlag uint8) bool {
  result := user.flag & typeFlag
  return result == typeFlag
}

func binaryTest() {
  var user users
  user.name = "coder"
  user.flag = 0

  //判斷用戶是否是vip
  result := isFlag(user, vip)
  fmt.Printf("user is Vip:%t\n", result)

  //給用戶開(kāi)通vip,并看用戶是否開(kāi)通vip
  user = setFlag(user, true, vip)
  result = isFlag(user, vip)
  fmt.Printf("user is Vip:%t\n", result)

  //取消用戶的vip,并查看用戶是否還是vip
  user = setFlag(user, false, vip)
  result = isFlag(user, vip)
  fmt.Printf("user is Vip:%t\n", result)
}

func main() {
  binaryTest()
}

上面代碼就是一種位運(yùn)算一種非常巧妙的用法,當(dāng)新添加各種特權(quán)的時(shí)候只需要在最開(kāi)始定義的常亮那里添加一行代碼即可,就可以直接實(shí)現(xiàn)對(duì)這種特權(quán)的設(shè)置和取消,以及查看是否開(kāi)通。

附常見(jiàn)的>>右移 <<左移 感覺(jué)右移左移應(yīng)該也是非常常見(jiàn)的使用了

繼續(xù)看例子:

package main

import "fmt"

func main() {
  x := 2
  y := 4
  fmt.Println(x<<1)
  fmt.Println(y>>1)
}output:4 2

進(jìn)行轉(zhuǎn)化為二進(jìn)制 然后向左或者向右移動(dòng)。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:

相關(guān)文章

最新評(píng)論

新郑市| 繁昌县| 郧西县| 大悟县| 平遥县| 苏州市| 盈江县| 门头沟区| 泾阳县| 宜城市| 伊吾县| 新丰县| 梧州市| 西充县| 普安县| 阿勒泰市| 天津市| 金华市| 衡南县| 河源市| 北票市| 澄迈县| 广南县| 沙田区| 砀山县| 柳河县| 来凤县| 昌宁县| 柏乡县| 肇州县| 丹棱县| 顺平县| 德昌县| 尤溪县| 博白县| 乃东县| 福清市| 莆田市| 平潭县| 台州市| 正镶白旗|