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))
いくつかのテクニック
違いがあるので、アルゴリズムを作るときは注意しなければなりません.ここではいくつかのコードを示します
位を下げる
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
[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