Pythonとjava/C++シフトの違い


Pythonシフト演算適合は他の言語とは異なります
[TOC]pythonでは整数は桁数に制限されないのでオーバーフローしません.シフト時にシンボルビットは変わらない!
Javaでのシフト:
64ビットlong整数:大数:00000000000000000000000000000 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
System.out.println( Long.toBinaryString(0x00000000FFFFFFFFL >>32)); System.out.println( Long.toBinaryString(0x00000000FFFFFFFFL <<32>>>32));
Python中変位
大数:00000000000000000000000000000000000000000 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000 00000000000000000000000000000右シフト3200000000000000000000000000000000000000000000000
bstr = lambda x, l: ”.join((‘1’ if x & (1 << i) else ‘0’ for i in range(l, -1, -1))) print(bstr(0x00000000FFFFFFFF, 64)) print(bstr(0x00000000FFFFFFFF >> 32, 64)) print(bstr(0x00000000FFFFFFFF << 32, 64))
いくつかのテクニック
違いがあるので、アルゴリズムを作るときは注意しなければなりません.ここではいくつかのコードを示します
#   java      32 。
#   ,         ,           。
#         64    32 

def int_overflow(val):
    maxint = 2147483647
    if not -maxint - 1 <= val <= maxint:
        val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1
    return val


def unsigned_right_shitf(n, i):
    #     0,   32    uint
    if n < 0:
        n = ctypes.c_uint32(n).value
    #           ,      js   ,           
    if i < 0:
        return -int_overflow(n << abs(i))
    # print(n)
    return int_overflow(n >> i)


def unsigned_left_shitf(n, i):
    #     0,   32    uint
    if n < 0:
        n = ctypes.c_uint32(n).value
    #           ,      js   ,           
    if i < 0:
        return -int_overflow(n << abs(i))
    # print(n)
    return int_overflow(n & (2**i-1)) #     。

#    
print(0x00000000FFFFFFFF >> 32)
print(0x00000000FFFFFFFF << 32)
print(unsigned_right_shitf(key, 32))
print(unsigned_left_shitf(key, 32))

位を下げる
big=0 x 12345678123456778 b 8=big&0 xFF#低8ビットb 16=big&0 xFFFF#低16ビット結果はいずれも正数
リファレンス
[1] https://www.cnblogs.com/zhengyun_ustc/archive/2009/10/14/shifting.html [2] https://www.jianshu.com/p/24d11ab44ae6