在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 ('&') 操作:
<code class="go">fmt.Printf("Is Admin? %v\n", isAdmin & 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中文網其他相關文章!