Go では、ビットマスクとビットごとの操作により、バイナリ データを操作する効率的な方法が提供されます。これらの操作がどのように機能するかを調べて、ビットマスキングに関する混乱を解消しましょう。
ビットマスキングは、特別に作成された定数を利用してさまざまな役割や権限を表す手法です。コード スニペットでは、iota 定数を使用して、特定の位置に単一の「1」ビットを含む一連の定数を作成しました。次に、これらの定数を使用して、ビットごとの OR ('|') を使用してロール変数を構築します。
<code class="go">var roles byte = isAdmin | canSeeFinancials | canSeeEurope</code>
この操作は、ロール内の '1' ビットを、3 つのロールの '1' ビットの位置と一致するように設定します。定数。バイナリ表現を視覚化すると役立ちます:
isAdmin 00000001 canSeeFinancials 00000100 canSeeEurope 00100000 ------------------------- roles 00100101
混乱は、次の行で使用されているビット単位の AND ('&') 演算から生じています:
<code class="go">fmt.Printf("Is Admin? %v\n", isAdmin & roles == isAdmin)</code>
この操作は、isAdmin がロール変数に設定されているかどうかを確認します。ただし、式はAdmin &です。ロールは、isAdmin とロールの両方に「1」ビットがある場合にのみ、「1」ビットを含む数値を返します。
あなたの場合、ロールには isAdmin ビットが含まれているため、isAdmin & の結果は、ロールは isAdmin と等しくなります。このため、式は true と評価されます。
ただし、それほど厳密ではないビットごとの等価性 (==) を使用すると、ロールのバイナリ表現全体が isAdmin と比較されることになります。ロールには追加のビットが含まれているため、isAdmin と等しくなくなり、false になります。
ビットマスキングとビット単位の演算は、バイナリ データに対して論理演算を効率的に実行できる強力なツールです。ビット操作の背後にある概念を理解することで、Go でより堅牢で効率的なコードを作成できます。
以上がGo ではビット単位の操作とマスキングはどのように機能しますか?また、「isAdmin &roles == isAdmin」が True と評価されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。