【问题标题】:translating Matlab's bitget() extreme value to python将 Matlab 的 bitget() 极值转换为 python
【发布时间】:2017-11-17 08:35:39
【问题描述】:

我得到了包含这样一个循环的 Matlab 代码:

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

我遇到的问题是 Matlab (Octave) 显然在右侧添加了填充位:

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

   1   0   1   0   0   0   0   0   0   0

因此:

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

而 python 不添加这些位,因此会产生错误。

对于这种特殊情况,我是否相信上述 Matlab 行 bitget(n-1,10)*2^4; 可以转换为 python 为 (lambda x: 1 if x == 2**9 else 0)(n)*2**4,因为在我看来,如果 n 的二进制表示跨度,Matlab bitget(5,10) 只会产生 1 10 位,在这种情况下是 2^9?

【问题讨论】:

    标签: python matlab binary


    【解决方案1】:

    我认为您误解了 Octave 的输出。让我们用不同的值尝试您的示例,以便我们了解发生了什么。

    >> 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。它不是在右侧填充,它只是从一个大于存储值 13 所需的 4 位的数字类型中读取 0 位。

    现在,无论其他位的状态如何,只要指定位为 1bitget 就会返回 1。所以bitget(n-1,10) 不仅会为2**9 = 512 返回1,而且还会为任何其他设置了该位的值返回;在这种情况下,512..1023 范围内的任何值。您的 Python 函数中的相等比较不会给您,因此您需要将其更改为按位 AND:

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

    这里我将== 更改为& 并且2**10 变为2**9 以匹配第10 位的值。

    【讨论】:

      猜你喜欢
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 2015-11-01
      • 2017-12-12
      • 1970-01-01
      • 2014-03-05
      • 2021-03-10
      相关资源
      最近更新 更多