今日pythonでキャレット演算子を見つけて試してみたところ、次の出力が得られました。
>>> 8^3
11
>>> 8^4
12
>>> 8^1
9
>>> 8^0
8
>>> 7^1
6
>>> 7^2
5
>>> 7^7
0
>>> 7^8
15
>>> 9^1
8
>>> 16^1
17
>>> 15^1
14
>>>
8に基づいているようですので、何らかのバイト操作を推測していますか?この検索サイトについては、フロートに対して奇妙に振る舞う以外はあまり見つけられないようですが、誰かがこの演算子の機能へのリンクを持っていますか、ここで説明できますか?
ビット単位です [〜#〜] xor [〜#〜] (排他的OR)。
one(かつ1つのみ)のオペランド(評価)がtrueの場合、trueになります。
実証するには:
>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
独自の例を説明するには:
>>> 8^3
11
次のように考えてください:
1000#8(バイナリ) 0011#3(バイナリ) ----#APPLY XOR( 'vertically') 1011#結果= 11(バイナリ)
必要に応じて、オブジェクトの__xor__()
または__rxor__()
メソッドを呼び出します。これは、整数型の場合、ビット単位の排他的ORを実行します。
ビットごとの排他的ORです。バイナリのビット演算子は Python Language Reference の5章で説明されています。
一般的に、シンボル^
は、 中置記号__xor__
または__rxor__
メソッドのバージョンです。シンボルの左右に配置されるデータ型はすべて、互換性のある方法でこの関数を実装する必要があります。整数の場合、これは一般的なXOR
操作ですが、たとえば、タイプfloat
とタイプint
の関数の組み込み定義はありません。
In [12]: 3 ^ 4
Out[12]: 7
In [13]: 3.3 ^ 4
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-13-858cc886783d> in <module>()
----> 1 3.3 ^ 4
TypeError: unsupported operand type(s) for ^: 'float' and 'int'
Python)のすばらしい点の1つは、独自のクラスでこの動作をオーバーライドできることです。たとえば、一部の言語では、^
記号は累乗を意味します。 、ちょうど一例として:
class Foo(float):
def __xor__(self, other):
return self ** other
その後、このようなものが動作し、今、Foo
onlyのインスタンスでは、^
記号は累乗を意味します。
In [16]: x = Foo(3)
In [17]: x
Out[17]: 3.0
In [18]: x ^ 4
Out[18]: 81.0