88

ブール演算子とビット演算子をいつ使用する必要があるかについて混乱しています

  • and&
  • or|

いつそれぞれを使用するのか、いつ一方を他方の上に使用すると結果に影響するのかについて、誰かが私に教えてくれますか?

4

9 に答える 9

94

以下にいくつかのガイドラインを示します。

  • ブール演算子は通常ブール値で使用されますが、ビット演算子は通常整数値で使用されます。
  • ブール演算子は短絡していますが、ビット単位の演算子は短絡していません

短絡動作は、次のような式で役立ちます。

if x is not None and x.foo == 42:
    # ...

&両側が常に評価され、 が与えられるため、これはビットごとの演算子では正しく機能しませんAttributeError: 'NoneType' object has no attribute 'foo'。ブールand演算子を使用すると、最初の式が False の場合、2 番目の式は評価されません。同様にor、最初の引数が True の場合、2 番目の引数は評価されません。

于 2010-10-02T08:56:33.363 に答える
25

理論的には、andandorはブール論理から直接得られます (したがって、2 つのブール値を操作してブール値を生成します)。一方&、 and|はブール値および/または整数の個々のビットに適用します。後者が正確にどのように機能するかについて、多くの質問があります。

結果に影響を与える可能性のある実際的な違いは次のとおりです。

  1. andorたとえば、True or sys.exit(1)最初のオペランド ( True or ..., False and ...) の特定の値に対して、2 番目のオペランドは結果を変更しないため、評価する必要がないため、終了しません。しかし|&短絡しないでTrue | sys.exit(1)ください-REPLから抜け出します。
  2. &and|は通常の演算子でオーバーロードできますが、 whileandorは言語に偽造されています (ただし、ブール値への強制のための特別な方法には副作用がある場合があります)。
    • これは、演算子のオーバーロードを伴う他のいくつかの言語にも当てはまります
  3. andororの代わりにオペランドの値を返します。これは、条件のブール式の意味を変更しません - is ですが、true でもあります。しかし、かつては条件演算子をエミュレートするために使用されていました ( C 構文では、Python では)。との場合、結果の型は、オペランドがそれぞれの特殊メソッドをオーバーロードする方法によって異なります ( is 、is 、セットの場合は union/intersection ...)。 TrueFalse1 or True11cond ? true_val : false_valtrue_val if cond else false_val&|True & FalseFalse99 & 73
    • これは、Ruby、Perl、Javascript などの他の言語にも当てはまります。

しかし、ega_boolean & another_booleanが同じように機能する場合でも、適切な解決策は使用することですand-andとがブール式と条件にor関連付けられているためです。&|

于 2010-10-02T09:16:23.333 に答える
3

ヒントは名前にあります:

  • ブール演算子は、論理演算を実行するためのものです(プログラミングおよび形式論理で一般的な真偽テスト)。
  • ビット単位の演算子は、「ビット操作」 (バイトおよび数値データ型のビットの低レベル操作) 用です。

ビット単位の演算子を使用して論理演算を実行することは可能であり、場合によっては (通常は効率上の理由から) 望ましいこともありますが、一般的には、微妙なバグや望ましくない副作用を防ぐために、そのような目的では使用しないでください。

ビットを操作する必要がある場合、ビットごとの演算子は専用に構築されています。楽しい本: Hackers Delightには、ビットいじりで実現できるクールで真に役立つ例がいくつか含まれています。

于 2010-10-02T09:08:36.510 に答える
1

ブール演算は論理演算です。

ビット演算は、バイナリ ビットに対する演算です。

ビット演算:

>>> k = 1
>>> z = 3
>>> k & z  
1
>>> k | z  
3

操作:

  • AND &: 両方のビットが 1 の場合は 1、それ以外の場合は 0
  • OR |: いずれかのビットが 1 の場合は 1、それ以外の場合は 0
  • XOR ^: ビットが異なる場合は 1、同じ場合は 0
  • NOT ~': 各ビットを反転

ビット演算の使用例:

  1. ビットの設定とクリア

ブール演算:

>>> k = True
>>> z = False
>>> k & z  # and
False
>>> k | z  # or
True
>>> 
于 2010-10-02T08:59:14.607 に答える