python 中的一位循环移位(相当于 Fortran 的 ISHFTC)
Circular shift of a bit in python (equivalent of Fortran's ISHFTC)
我想使用 python 在 Fortran 中实现与 ISHFTC 函数等效的功能。
最好的方法是什么?
例如,
x = '0100110'
s = int(x, 2)
s_shifted = ISHFTC(s,1,7) #shifts to left by 1
#binary representation of s_shifted should be 1001100
我的尝试基于Circular shift in c
def ISHFTC(n, d,N):
return (n << d)|(n >> (N - d))
然而,这并不是我想要的。例如,
ISHFTC(57,1,6) #57 is '111001'
给出 115,即“1110011”,而我想要“110011”
您尝试的解决方案无效,因为 Python 有无限大小的整数。
它在 C 中有效(对于 N
的特定值,取决于使用的类型,通常是 8 或 32),因为向左移出的位会自动被截断。
您需要在 Python 中明确执行此操作才能获得相同的行为。可以使用 % (1 << N)
将值截断到最低的 N 位(除以 2N[=32= 的余数) ]).
示例:ISHFTC(57, 1, 6)
我们希望保留 |......|
中的 6 位,并截断左侧的所有位。右边的位被自动截断,因为这些已经是 6 个最低有效位。
n |111001|
a = n << d 1|110010|
m = (1 << N) 1|000000|
b = a % m 0|110010|
c = n >> (N - d) |000001|(11001)
result = b | c |110011|
结果代码:
def ISHFTC(n, d, N):
return ((n << d) % (1 << N)) | (n >> (N - d))
# ^^^^^^ a
# ^^^^^^ m
# ^^^^^^^^^^^^^^^^^ b
# ^^^^^^^^^^^^ c
>>> ISHFTC(57, 1, 6)
51
>>> bin(_)
'0b110011'
我想使用 python 在 Fortran 中实现与 ISHFTC 函数等效的功能。 最好的方法是什么?
例如,
x = '0100110'
s = int(x, 2)
s_shifted = ISHFTC(s,1,7) #shifts to left by 1
#binary representation of s_shifted should be 1001100
我的尝试基于Circular shift in c
def ISHFTC(n, d,N):
return (n << d)|(n >> (N - d))
然而,这并不是我想要的。例如,
ISHFTC(57,1,6) #57 is '111001'
给出 115,即“1110011”,而我想要“110011”
您尝试的解决方案无效,因为 Python 有无限大小的整数。
它在 C 中有效(对于 N
的特定值,取决于使用的类型,通常是 8 或 32),因为向左移出的位会自动被截断。
您需要在 Python 中明确执行此操作才能获得相同的行为。可以使用 % (1 << N)
将值截断到最低的 N 位(除以 2N[=32= 的余数) ]).
示例:ISHFTC(57, 1, 6)
我们希望保留 |......|
中的 6 位,并截断左侧的所有位。右边的位被自动截断,因为这些已经是 6 个最低有效位。
n |111001|
a = n << d 1|110010|
m = (1 << N) 1|000000|
b = a % m 0|110010|
c = n >> (N - d) |000001|(11001)
result = b | c |110011|
结果代码:
def ISHFTC(n, d, N):
return ((n << d) % (1 << N)) | (n >> (N - d))
# ^^^^^^ a
# ^^^^^^ m
# ^^^^^^^^^^^^^^^^^ b
# ^^^^^^^^^^^^ c
>>> ISHFTC(57, 1, 6)
51
>>> bin(_)
'0b110011'