Golang中的位掩码和位运算 [英] Bitmasking and Bitwise Operations in Golang
本文介绍了Golang中的位掩码和位运算的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
总的来说,我是编程的初学者,所以如果我在提出这个问题时犯了一些错误,我很抱歉。
我正在学习的教程复习了以下代码:
package main
import (
"fmt"
)
const (
isAdmin = 1 << iota
isHeadquarters
canSeeFinancials
canSeeAfrica
canSeeAsia
canSeeEurope
canSeeNorthAmerica
canSeeSouthAmerica
)
func main() {
var roles byte = isAdmin | canSeeFinancials | canSeeEurope
fmt.Printf ("%b
", roles)
fmt.Printf ("Is Admin? %v
", isAdmin & roles == isAdmin)
}
教程中的人很快就提到了此部件如何称为位掩码。
fmt.Printf ("Is Admin? %v
", isAdmin & roles == isAdmin)
现在,据我所知,这里发生的过程是这样的:
计算机被询问isAdmin和角色是否都等于isAdmin,并回答真。
但是,当我尝试这样做时:
fmt.Printf ("Is Admin? %v
", roles == isAdmin)
这将导致假。
有人可以更详细地介绍这一过程背后的整个逻辑吗?这一点让我有点困惑,我想知道为什么会这样。谢谢。
推荐答案
您的所有角色常量都是特殊数字,其中二进制(2的补码)表示恰好包含单个1
位,所有其他位都是零,并且它们都不同(1
位在每个位中的不同位置)。这是通过将1
数字左移并递增数值(iota
)来实现的。
role
变量的值是使用按位OR:
var roles byte = isAdmin | canSeeFinancials | canSeeEurope
按位或保留1
位,结果中将只有0
位,其中每个操作数在该位置包含0
位。由于所有要进行或运算的值都在不同位置包含一个1
位,因此role
将在其特殊位置包含与被或运算的不同角色一样多的位。
为便于理解这些位,让我们打印二进制表示法:
fmt.Printf("isAdmin %08b
", isAdmin)
fmt.Printf("canSeeFinancials %08b
", canSeeFinancials)
fmt.Printf("canSeeEurope %08b
", canSeeEurope)
fmt.Printf("-------------------------
")
fmt.Printf("roles %08b
", roles)
这将输出:
isAdmin 00000001
canSeeFinancials 00000100
canSeeEurope 00100000
-------------------------
roles 00100101
如您所见,roles
包含1
,上面的任何位模式都有1
。
使用按位AND(掩码)时,如果任一输入位在给定位置0
,则结果位将为0
,并且仅当两个位都是1
s时,结果位才为1
。
表达式:
isAdmin & roles
由于isAdmin
包含单个1
位,因此仅当roles
在该位置具有1
位时,上述掩码才是最多也可以包含单个1
位的数字。该掩码有效地告知roles
是否包含isAdmin
位。如果它包含它,结果将是一个等于isAdmin
的值。如果不是,结果将是一个由所有0
位组成的数字,即:DECIMAL0
。
再次可视化比特:
fmt.Printf("roles %08b
", roles)
fmt.Printf("isAdmin %08b
", isAdmin)
fmt.Printf("-------------------------
")
fmt.Printf("isAdmin & roles %08b
", isAdmin&roles)
输出:
roles 00100101
isAdmin 00000001
-------------------------
isAdmin & roles 00000001
在Go Playground上尝试示例。
所以表达式:
isAdmin & roles == isAdmin
如果roles
包含(包括)isAdmin
角色,则true
将为true
,否则false
。
不屏蔽:
roles == isAdmin
如果roles
等于isAdmin
,即,如果它只包含isAdmin
角色,不包含任何其他角色,则true
为true
。如果包含其他角色,则显然不等于isAdmin
。
这篇关于Golang中的位掩码和位运算的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文