質問

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

  • and&
  • or|

誰かが私がそれぞれをいつ使用するのか、そしていつ他のものを使用するのかについて私を啓発することができますか?

役に立ちましたか?

解決

ここにいくつかのガイドラインがあります:

  • ブール演算子は通常ブール値で使用されますが、ビット演算子は通常整数値で使用されます。
  • ブール演算子は短絡ですが、ビット演算子は短絡ではありません。

    短絡動作は、次のような式で役立ちます。 ジェネラコディセタグプレ

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

他のヒント

理論的には, andor ブール論理からまっすぐに来ます(したがって、ブール値を生成するために二つのブール値を操作します)。 &| ブール値および/またはを整数の個々のビットに適用します。後者が正確にどのように機能するかについては、ここにはたくさんの質問があります。

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

  1. andor 短絡、すなわち True or sys.exit(1) は終了しません。特定の値(True or ..., False and ... 最初のオペランドの場合、2番目のオペランドは結果を変更しません=評価する必要はありません。しかし、 |& 短絡しないでください - True | sys.exit(1) あなたをREPLから投げ出します。
  2. (一部にのみ適用されますか?Pythonを含む演算子のオーバーロードを伴う言語:) &| 通常の演算子であり、過負荷にすることができます - andor 言語に偽造されています(少なくともPythonでは、ブール値への強制のための特別な方法は副作用があるかもしれません)。
  3. (いくつかの言語にのみ適用されます[KennyTMのコメントを参照してください]:) andor 戻り値(常に?これを本当に理解することはありませんし、私はそれを必要としませんでした)の代わりにオペランドの値 True または False.これは、条件内のブール式の意味を変更しません - 1 or True1, しかし、 1 それも本当です。しかし、かつては条件演算子をエミュレートするために使用されていました(cond ? true_val : false_val cの構文では, true_val if cond else false_val 数年以来のPythonで)。のために &|, 、結果の型は、オペランドがそれぞれの特別なメソッドをどのようにオーバーロードするかに依存します(True & FalseFalse, 99 & 73, 、セットの場合、それは組合/交差点です。..).

しかし、例えば a_boolean & another_boolean 同じように動作するだろう、適切な解決策は、使用しています and -単に理由 andor ブール式と条件に関連付けられている間 &| ビットtwiddlingのために立ちます。

もう少し違いがありますが、しばらく戸惑いました。&(およびその他のビット演算子)はand(およびその他のブール演算子)よりも優先順位が高いため、次の式は異なる値に評価されます。 ジェネラコディセタグプレ

ジェネラコディセタグプレ

つまり、最初のコードは、False、つまり0 < (1 & 0) < 2、つまり0 < 0 < 2と同等であるため、0 < 0 and 0 < 2を生成します。

numpyで要素ごとのブール演算を実行しようとしている場合、答えは多少異なります。要素ごとのブール演算には&|を使用できますが、andorは値エラーを返します。

念のため、 numpyロジック関数を使用できます。 ジェネラコディセタグプレ

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

ビット演算はバイナリビットの演算です。

ビット演算: ジェネラコディセタグプレ

操作: ジェネラコディセタグプレ

ビット演算の使用法のいくつか:

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

ブール演算: ジェネラコディセタグプレ

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

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

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

    ビットを操作する必要がある場合、ビット単位の演算子は専用です。楽しい本: Hackers Delight には、クールで本当に役立つ例がいくつか含まれています。ビットをいじることで達成できます。

一般的な規則は、既存のオペランドに適切な演算子を使用することです。ブールオペランドでブール(論理)演算子を使用し、(より広い)整数オペランドでビット演算子を使用します(注: False 0 および True から 1 )。唯一の「トリッキーな」シナリオは、ブール演算子を非ブールオペランドに適用することです。
[SO]:Python- 'と'の違いで説明されているように、簡単な例を見てみましょう。 'および'& '[重複] 5 & 7 vs。 5 and 7

ビット単位のおよび )の場合、状況は非常に簡単です:

ジェネラコディセタグプレ

論理および の場合、 [Python 3]:ブール演算の状態(強調は私のものです):

およびまたは値とタイプを制限して False em> True ですが、最後に評価された引数を返します

ジェネラコディセタグプレ

もちろん、同じことが | vs。 またはにも当てはまります。

ブール値 'および'とビット単位の '&':

擬似コード/ Pythonは、これらの違いを理解するのに役立ちました: ジェネラコディセタグプレ

論理演算

は通常、条件文に使用されます。例えば:

if a==2 and b >10 then /*Do something...*/ endif これは、両方の条件((a==2)(b>10))が同時に真である場合、条件文本体を実行できることを意味します。

ビット単位の演算

ビット単位の演算は、データの操作と抽出に使用できます。たとえば、整数の4つのLSB(最下位ビット)を抽出する場合は、次のようにします:

抽出:

poo & 0x000F

マスキング:

poo | 0xFFF0

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top