2017-06-15 101 views
0

我得到的含有這樣的循環Matlab代碼保持:平移Matlab的bitget()極值到Python

for n = 1:2^10, 
bitget(n-1,10)*2^4; 
end; 

我的問題是,Matlab的(八度)顯然添加填充比特向右這樣:

octave:15> bitget(5,1:10) 
ans = 

    1 0 1 0 0 0 0 0 0 0 

,因此:

octave:14> bitget(5,10) 
ans = 0 

而蟒不添加這些位,因此產率一個錯誤。

對於這種特殊的情況,我說的對中認爲上述Matlab的線bitget(n-1,10)*2^4;可以翻譯成蟒蛇爲(lambda x: 1 if x == 2**9 else 0)(n)*2**4,因爲Matlab的bitget(5,10)將在我看來,只有產生1,如果n的二進制表示跨越10位,即2^9在這種情況下?

回答

2

我認爲你誤解了八度的輸出。讓我們用不同的值來嘗試你的例子,這樣我們就可以看到發生了什麼。

>> dec2bin(13) 
ans = 1101 

>> bitget(13,1:10) 
ans = 

    1 0 1 1 0 0 0 0 0 0 

正如你所看到的,位的順序已經顛倒過來。在bitget中,位1是最低有效位,或者2**0和位102**9。它不是右邊的填充,它只是從數字類型中讀取0位,該數字類型比存儲值13所需的4位大。

現在,只要指定位是1,現在,bitget將返回1,而不管其他位的狀態如何。所以bitget(n-1,10)將不僅返回12**9 = 512,但也爲該位設置的任何其他值;在這種情況下,範圍爲512..1023的任何值。在你的Python功能相等比較不會給你,所以你需要將其更改爲按位與:

(lambda x: 1 if x & 2**9 else 0)(n)*2**4 

在這裏,我已經改變了==&2**10成爲2**9匹配的值第10位。