python中的循环移位相当于Fortran的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,6) #57 is '111001'

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

解决方法

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

它可以在C语言中工作(对于N的特定值,取决于所使用的类型,通常为8或32),因为移到左边的位会被自动截断。

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

示例: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,6)
51
>>> bin(_)
'0b110011'

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...