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'