タイトルからわかるように、JavaScriptには特定の演算子>>>
があります。たとえば、JavaScriptでは次の結果になります。
(-1000) >>> 3 = 536870787
(-1000) >> 3 = -125
1000 >>> 3 = 125
1000 >> 3 = 125
これを表す特定のメソッドまたは演算子はありますか>>>
?
これには組み込みの演算子はありませんが、>>>
を自分で簡単にシミュレートできます。
>>> 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
いいえ、ありません。 pythonの右シフトは算術です。
負の数の符号ビットを0x100000000でマスクして反転しようとすることは、語長についての仮定が難しいため、根本的に誤解されています。私はプログラマーとして、24、48、16、18、32、36、64ビットの数値を扱いました。 37や2の補数ではなく1の補数を使用する算術演算など、奇数長で動作するマシンについても聞いたことがあります。数値が2進数であることを超えて、数値の内部表現について行う仮定は危険です。
バイナリの仮定でさえ絶対に安全ではありませんが、私たちはそれを許可すると思います。 :)
Numpy は、これを行う right_shift()
関数を提供します。
>>> import numpy
>>> numpy.right_shift(1000, 3)
125
これが aixの答え のスピンオフです。正の値を入力すると通常の右シフト演算子が機能するので、実際には符号付きから符号なしへの変換を探しています。
def unsigned32(signed):
return signed % 0x100000000
>>> unsigned32(-1000) >> 3
536870787L
数値が負の場合、トップビットが設定され、右シフトごとにトップビットも設定する必要があることを覚えておく必要があります。
これが私の実装です:
def rshift(val, n):
s = val & 0x80000000
for i in range(0,n):
val >>= 1
val |= s
return val
モジュロなしで機能するソリューション:
>>> def rshift(val,n): return (val>>n) & (0x7fffffff>>(n-1))
7fffffffは正の数であり、左にゼロを追加する右シフトであるため、これは機能します。
フロアディビジョンを使用することもできます。
def rshift(val, n):
if val > 0:
return val >> n
return val // -(2^n)