如何解决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'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。