python 中的一位循环移位(相当于 Fortran 的 IHFTC)

use*_*663 2 python binary bit-shift

我想使用 python 实现 Fortran 中 ISHFTPC 函数的等效功能。做这个的最好方式是什么?

例如,

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
Run Code Online (Sandbox Code Playgroud)

我的尝试基于c 中的循环移位

def ISHFTC(n, d,N):  
    return (n << d)|(n >> (N - d)) 
Run Code Online (Sandbox Code Playgroud)

但是,这并没有达到我想要的效果。例子,

ISHFTC(57,1,6) #57 is '111001'
Run Code Online (Sandbox Code Playgroud)

给出 115,即“1110011”,而我想要“110011”

mkr*_*er1 9

您尝试的解决方案不起作用,因为 Python 具有无限大小的整数。

它适用于 C(对于 的特定值N,具体取决于所使用的类型,通常类似于 8 或 32),因为向左移出的位会自动截断。

您需要在 Python 中明确执行此操作才能获得相同的行为。可以使用(除以 2 N的余数)将值截断为最低N位。% (1 << N)

例子: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|
Run Code Online (Sandbox Code Playgroud)

结果代码:

def ISHFTC(n, d, N):  
    return ((n << d) % (1 << N)) | (n >> (N - d))
          #  ^^^^^^ a
          #             ^^^^^^ m
          #  ^^^^^^^^^^^^^^^^^ b
          #                         ^^^^^^^^^^^^ c
Run Code Online (Sandbox Code Playgroud)
def ISHFTC(n, d, N):  
    return ((n << d) % (1 << N)) | (n >> (N - d))
          #  ^^^^^^ a
          #             ^^^^^^ m
          #  ^^^^^^^^^^^^^^^^^ b
          #                         ^^^^^^^^^^^^ c
Run Code Online (Sandbox Code Playgroud)