首页  >  文章  >  后端开发  >  Go 中按位运算和屏蔽是如何工作的,为什么“isAdmin & Roles == isAdmin”的计算结果为 True?

Go 中按位运算和屏蔽是如何工作的,为什么“isAdmin & Roles == isAdmin”的计算结果为 True?

Patricia Arquette
Patricia Arquette原创
2024-10-27 03:07:02631浏览

How Do Bitwise Operations and Masking Work in Go, and Why Does

Golang 中的位掩码和按位运算:了解按位逻辑

在 Go 中,位掩码和按位运算提供了操作二进制数据的有效方法。让我们探索这些操作的工作原理,并澄清您对位掩码的困惑。

位掩码:入门

位掩码是一种利用特制常量来表示不同角色或权限的技术。在代码片段中,您使用 iota 常量创建了一系列常量,每个常量在特定位置包含一个“1”位。然后使用这些常量使用按位 OR ('|') 构造角色变量:

<code class="go">var roles byte = isAdmin | canSeeFinancials | canSeeEurope</code>

此操作将角色中的 '1' 位设置为与三个角色中的 '1' 位的位置相匹配常数。可视化二进制表示有助于:

isAdmin          00000001
canSeeFinancials 00000100
canSeeEurope     00100000
-------------------------
roles            00100101

按位 AND 和掩码

您的困惑源于此行中使用的按位 AND ('&') 操作:

<code class="go">fmt.Printf("Is Admin? %v\n", isAdmin &amp; roles == isAdmin)</code>

此操作检查是否在roles 变量中设置了isAdmin。然而,表达式是Admin &仅当 isAdmin 和 Roles 都有“1”位时,roles 返回一个包含“1”位的数字。

在您的情况下,由于 Roles 包含 isAdmin 位,因此 isAdmin & 的结果是角色将等于 isAdmin。这就是表达式计算结果为 true 的原因。

但是,如果您使用不太严格的按位相等 (==),则会将角色的整个二进制表示形式与 isAdmin 进行比较。由于 Roles 包含额外的位,因此它不等于 isAdmin,从而导致 false。

结论

位掩码和按位运算是强大的工具,可让您有效地对二进制数据执行逻辑运算。通过理解位操作背后的概念,您可以在 Go 中编写更健壮、更高效的代码。

以上是Go 中按位运算和屏蔽是如何工作的,为什么“isAdmin & Roles == isAdmin”的计算结果为 True?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn