web-dev-qa-db-ja.com

(5 | -2)> 0がFalseである理由がわからない(5または-2)> 0がTrueである

これは、私が答えを見つけることができなかったかなり些細な質問です。

ここに問題があります。次の配列があります:

vals = [-5, 2]

そして、val[0]またはval[1]は0より大きいです。どちらかがtrueの場合、Trueを出力する必要があります。

私の当面の考えは使用することでした。 (vals[1] or vals[0]) > 0)が見つかりました(5 | -2) > 0はFalseであり、(5 or -2) > 0はTrueです

明確化をいただければ幸いです。

18
madsthaks

or|の違いは何ですか?

orは論理ORで、|はビット単位または論理包含ORです。

論理または

論理またはin pythonは、真である最初の値を返します。

例:

>>> None or False or 5
5
>>> -5 or 2
-5

ビット単位または論理的な包含または

ビット単位または論理的な包含またはpythonの|演算子によって表され、指定された少なくとも1つに設定されているすべてのビットが設定されている 数値を作成します数値

例:

  • 2はバイナリ0010です
  • 4はバイナリ0100

論理和または2つの間の結果は0110で6になります。

>>> 2 | 4
6

負の数がどのように格納されるかは、一般的に実装固有です。ただし、ほとんどのシステムでは、各ビットを反転して1を加えることにより、正の数の 2の補数 を作成することにより、負の数が格納されます。

ビット単位の鉱石2のその数は、他の数でも負の数になります。

>>> -5 | 2
-5

どちらもあなたの問題を解決しません

使用中

(vals[1] or vals[0]) > 0

動作するようですが、値を反転すると失敗します:

>>> vals = [2, -5]
>>> (vals[1] or vals[0]) > 0
False

両方の値を別々にチェックする必要があります

>>> vals = [-5, 2]
>>> vals[0] > 0 or vals[1] > 0
True

入力が大きい場合、これは不便な場合があります。ジェネレータ式では any を使用する必要があります。

>>> any(x > 0 for x in vals)
True
44
kalehmann

any関数が必要です:

>>> any(x > 0 for x in vals)

x | yは2つの値のビット単位のORを計算しますが、x or yは最初の「真の」値に評価されます。どちらの場合も、result0(x or y) > 0および(x | y) > 0と比較されます。

比較したいものeach値を(必要に応じて)0に、

vals[0] > 0 or vals[1] > 0

3つの値がある場合は、次のように記述します

vals[0] > 0 or vals[1] > 0 or vals[2] > 0

any関数はこれを任意のサイズのリストに一般化します。リストのサイズに基づいてorを一緒に使用する用語の数を決定する必要はありません。

14
chepner

この質問に答えるには、ツーの補数について説明する必要があります。

数値のバイナリ表現

つまり、内部的には、5のような整数はバイナリ文字列として表されます。

00000000000000000000000000000101

負の数を表すとどう思いますか?

さて、これが私たちがしたいことです:

  • 加算は負の数と正の数で同じように機能するはずです。つまり、4 + 9を4 + -9と追加する場合と同じ手順を実行します。

  • 整数オーバーフローは数学を壊すべきではありません。つまり、MAX_VALUE + 1 == MIN_VALUEMIN_VALUE - 1 == MAX_VALUE

つまり、私たちが行うことは「2の補数」と呼ばれます。

2の補数

負の数を表すには、その絶対値を取り、ビットごとにビットフリップして、1を加算します。

正の数が5の場合

00000000000000000000000000000101

負の数-5は

11111111111111111111111111111011

基本的に、これは01111111111111111111111111111111は最大の正の数になり、その後のすべての数は負になります。

(5 | -2)はどういう意味ですか?

|はビット単位のor演算子です。 2つの数値が与えられると、すべてのビットが取得され、それらがまとめられて、元の2つの数値のどちらかまたは両方のその位置の数字が1である場合、その数字は1であり、それ以外の場合は0である新しい数字が作成されます。計算は次のようになります。

   5 -> 00000000000000000000000000000101
| -2 -> 11111111111111111111111111111110
----    --------------------------------
        11111111111111111111111111111111 -> -1

ご覧のとおり、5 | -2 = -1 <0。

(5または-2)について

「or」演算子は、2つの値それらをブール値にキャストとorを一緒に取ります。これは重要です。値がないか、値である場合、「真の」最初の値を返します。つまり、ifステートメントに入れた場合、実行されます。

「真実」でない唯一の整数は0です。したがって、(5または-2)は、5と2の最初のゼロ以外の整数である5> 0を返します。したがって、5または-2 = 5> 0です。

5
Q Science

|ビットごと ORであり、Pythonは整数に対して 2の補数 表現を使用します。5 | -2を評価すると、次のようになります。

  ... 0000 0000 0000 0101 (+5)
| ... 1111 1111 1111 1110 (-2)
──────────────────────────────
= ... 1111 1111 1111 1111 (-1)

また、-1はゼロより大きくないため、(5 | -2) > 0はfalseです。

orは論理ORです。この演算子がブール(True/False)値を返す他の言語とは異なり、Pythonはx or yx if x else yと同等であると定義します(xが1回だけ評価されることを除く) )Pythonではゼロ以外の数値はすべて「真実」であるため、x≠0の場合、x or yxと評価されます。

>>> 5 or -2
5
>>> -2 or 5
-2

(5 or -2) > 0がTrueと評価されるのは、最初に正の数を持つことから運がよかったことです。別の順序では、Falseになります。

一般に、(x or y) > 0は、意図した(x > 0) or (y > 0)notとではありません。

3
dan04

あなたがするとき(5 | -2)、ビット単位のORを実行しています。これにより、数値の否定ビットが保持されます。したがって、まだ負の数になります。

(5 or -2)は、Python=インタプリタがそれを次の論理演算子(より大)に拡張します)に対する論理ORです。

2
jhill515

これらは2つのまったく異なる操作であるため、それは予想されます。

説明のために、ここに小さなシェルログがあります。

In [1]: 5 or -2
Out[1]: 5

In [2]: 5 | -2
Out[2]: -1

or演算子は、最初のゼロ以外の値(非None、非Falseなど)を返します。

|演算子はビット単位のORを行います。説明する:

In [3]: bin(5)
Out[3]: '0b101'

In [4]: bin(-2)
Out[4]: '-0b10'

In [5]: bin(5 | -2)
Out[5]: '-0b1'
1
Wolph