ブール演算子とビット演算子をいつ使用する必要があるかについて混乱しています
and
対&
or
対|
いつそれぞれを使用するのか、いつ一方を他方の上に使用すると結果に影響するのかについて、誰かが私に教えてくれますか?
ブール演算子とビット演算子をいつ使用する必要があるかについて混乱しています
and
対&
or
対|
いつそれぞれを使用するのか、いつ一方を他方の上に使用すると結果に影響するのかについて、誰かが私に教えてくれますか?
以下にいくつかのガイドラインを示します。
短絡動作は、次のような式で役立ちます。
if x is not None and x.foo == 42:
# ...
&
両側が常に評価され、 が与えられるため、これはビットごとの演算子では正しく機能しませんAttributeError: 'NoneType' object has no attribute 'foo'
。ブールand
演算子を使用すると、最初の式が False の場合、2 番目の式は評価されません。同様にor
、最初の引数が True の場合、2 番目の引数は評価されません。
理論的には、and
andor
はブール論理から直接得られます (したがって、2 つのブール値を操作してブール値を生成します)。一方&
、 and|
はブール値および/または整数の個々のビットに適用します。後者が正確にどのように機能するかについて、多くの質問があります。
結果に影響を与える可能性のある実際的な違いは次のとおりです。
and
or
たとえば、True or sys.exit(1)
最初のオペランド ( True or ...
, False and ...
) の特定の値に対して、2 番目のオペランドは結果を変更しないため、評価する必要がないため、終了しません。しかし|
、&
短絡しないでTrue | sys.exit(1)
ください-REPLから抜け出します。&
and|
は通常の演算子でオーバーロードできますが、 whileand
とor
は言語に偽造されています (ただし、ブール値への強制のための特別な方法には副作用がある場合があります)。
and
oror
の代わりにオペランドの値を返します。これは、条件のブール式の意味を変更しません - is ですが、true でもあります。しかし、かつては条件演算子をエミュレートするために使用されていました ( C 構文では、Python では)。との場合、結果の型は、オペランドがそれぞれの特殊メソッドをオーバーロードする方法によって異なります ( is 、is 、セットの場合は union/intersection ...)。
True
False
1 or True
1
1
cond ? true_val : false_val
true_val if cond else false_val
&
|
True & False
False
99 & 7
3
しかし、ega_boolean & another_boolean
が同じように機能する場合でも、適切な解決策は使用することですand
-and
とがブール式と条件にor
関連付けられているためです。&
|
ヒントは名前にあります:
ビット単位の演算子を使用して論理演算を実行することは可能であり、場合によっては (通常は効率上の理由から) 望ましいこともありますが、一般的には、微妙なバグや望ましくない副作用を防ぐために、そのような目的では使用しないでください。
ビットを操作する必要がある場合、ビットごとの演算子は専用に構築されています。楽しい本: Hackers Delightには、ビットいじりで実現できるクールで真に役立つ例がいくつか含まれています。
ブール演算は論理演算です。
ビット演算は、バイナリ ビットに対する演算です。
ビット演算:
>>> k = 1
>>> z = 3
>>> k & z
1
>>> k | z
3
操作:
&
: 両方のビットが 1 の場合は 1、それ以外の場合は 0|
: いずれかのビットが 1 の場合は 1、それ以外の場合は 0^
: ビットが異なる場合は 1、同じ場合は 0~
': 各ビットを反転ビット演算の使用例:
ブール演算:
>>> k = True
>>> z = False
>>> k & z # and
False
>>> k | z # or
True
>>>