首頁  >  文章  >  後端開發  >  Go 中位元運算和屏蔽是如何運作的,為什麼「isAdmin & Roles == isAdmin」的計算結果為 True?

Go 中位元運算和屏蔽是如何運作的,為什麼「isAdmin & Roles == isAdmin」的計算結果為 True?

Patricia Arquette
Patricia Arquette原創
2024-10-27 03:07:02711瀏覽

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