web-dev-qa-db-ja.com

pythonで論理右バイナリシフトを取得する方法

タイトルからわかるように、JavaScriptには特定の演算子>>>があります。たとえば、JavaScriptでは次の結果になります。

(-1000) >>> 3 = 536870787

(-1000) >> 3 = -125

1000 >>> 3 = 125

1000 >> 3 = 125

これを表す特定のメソッドまたは演算子はありますか>>>

30
dementrock

これには組み込みの演算子はありませんが、>>>を自分で簡単にシミュレートできます。

>>> def rshift(val, n): return val>>n if val >= 0 else (val+0x100000000)>>n
... 
>>> rshift(-1000, 3)
536870787
>>> rshift(1000, 3)
125

次の代替実装では、ifの必要がなくなります。

>>> def rshift(val, n): return (val % 0x100000000) >> n
37
NPE

いいえ、ありません。 pythonの右シフトは算術です。

7
Femaref

負の数の符号ビットを0x100000000でマスクして反転しようとすることは、語長についての仮定が難しいため、根本的に誤解されています。私はプログラマーとして、24、48、16、18、32、36、64ビットの数値を扱いました。 37や2の補数ではなく1の補数を使用する算術演算など、奇数長で動作するマシンについても聞いたことがあります。数値が2進数であることを超えて、数値の内部表現について行う仮定は危険です。

バイナリの仮定でさえ絶対に安全ではありませんが、私たちはそれを許可すると思います。 :)

2
Raphael

>> = 演算子を使用して、- bitstring モジュールでゼロによるビット単位のシフトパディングを実行できます。

>>> a = BitArray(int=-1000, length=32)
>>> a.int
-1000
>>> a >>= 3
>>> a.int
536870787
2
Scott Griffiths

Numpy は、これを行う right_shift() 関数を提供します。

>>> import numpy
>>> numpy.right_shift(1000, 3)
125
2
jathanism

これが aixの答え のスピンオフです。正の値を入力すると通常の右シフト演算子が機能するので、実際には符号付きから符号なしへの変換を探しています。

def unsigned32(signed):
    return signed % 0x100000000

>>> unsigned32(-1000) >> 3
536870787L
1
Mark Ransom

数値が負の場合、トップビットが設定され、右シフトごとにトップビットも設定する必要があることを覚えておく必要があります。

これが私の実装です:

def rshift(val, n):
    s = val & 0x80000000
    for i in range(0,n):
        val >>= 1
        val |= s
    return val
1
blackd0t

モジュロなしで機能するソリューション:

>>> def rshift(val,n): return (val>>n) & (0x7fffffff>>(n-1))

7fffffffは正の数であり、左にゼロを追加する右シフトであるため、これは機能します。

0
Victor010

フロアディビジョンを使用することもできます。

def rshift(val, n):
    if val > 0:
        return val >> n
    return val // -(2^n)
0
Daniel