簡體   English   中英

python中位的循環移位(相當於Fortran的ISHFTC)

[英]Circular shift of a bit in python (equivalent of Fortran's ISHFTC)

我想在 Fortran 中使用 python 實現等效的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

我基於c 中的 Circular shift 的嘗試

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) (除以 2 N的余數)將值截斷到最低的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|

結果代碼:

def ISHFTC(n, d, N):  
    return ((n << d) % (1 << N)) | (n >> (N - d))
          #  ^^^^^^ a
          #             ^^^^^^ m
          #  ^^^^^^^^^^^^^^^^^ b
          #                         ^^^^^^^^^^^^ c
>>> ISHFTC(57, 1, 6)
51
>>> bin(_)
'0b110011'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM