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

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

 更新時(shí)間:2017年12月05日 11:04:14   作者:python修行路  
位運(yùn)算可能在平常的編程中使用的并不多,但涉及到底層優(yōu)化,一些算法及源碼可能會(huì)經(jīng)常遇見。下面這篇文章主要給大家介紹了關(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),但是也提供了我們寫代碼的一種思路

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

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

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

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

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è)置用戶開通了哪些特權(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 用于判斷用戶是否開通某項(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)

  //給用戶開通vip,并看用戶是否開通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í)候只需要在最開始定義的常亮那里添加一行代碼即可,就可以直接實(shí)現(xiàn)對(duì)這種特權(quán)的設(shè)置和取消,以及查看是否開通。

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

繼續(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)論

电白县| 赣州市| 龙里县| 资源县| 卓资县| 屏东市| 遂川县| 集安市| 乐业县| 体育| 资中县| 丹凤县| 赤峰市| 始兴县| 昌宁县| 句容市| 临泽县| 沙洋县| 米易县| 皋兰县| 巴马| 建瓯市| 天镇县| 通河县| 桑植县| 榆中县| 牟定县| 翼城县| 永吉县| 龙江县| 安平县| 安新县| 滦平县| 措勤县| 商南县| 英吉沙县| 伊川县| 淮南市| 大洼县| 山丹县| 潮安县|