Golang中的位掩码和位运算 [英] Bitmasking and Bitwise Operations in Golang

查看:17
本文介绍了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,并且仅当两个位都是1s时,结果位才为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角色,不包含任何其他角色,则truetrue。如果包含其他角色,则显然不等于isAdmin

这篇关于Golang中的位掩码和位运算的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆