Matlab:如何正确获得相当于2 ^ 63-1的面具?

时间:2013-08-04 19:55:16

标签: matlab integer uint64 bit-masks

我在MATLAB和64位整数方面遇到了一些问题。我希望有一个相当于2 ^ 63-1的掩码(除MSB之外的所有掩码),但是MATLAB似乎只是围绕着一切。

>> mask_fraction = uint64(9223372036854775807)

mask_fraction = 9223372036854775808 % This is 2^63 again, not 2^63-1!

同样,

  >> uint64(2^63)

    ans =  9223372036854775808       


    >> uint64(2^63-1)

    ans =  9223372036854775808

我的另一个尝试根本不起作用:

>> uint64(2^63) - 1
??? Undefined function or method 'minus' for input arguments of type 'uint64'.

思想?

4 个答案:

答案 0 :(得分:4)

@BasSwinckels正确地指出了一个问题。我会解决另一个问题。

第一个不可精确表示的双精度浮点整数是2^53+1。将表达式传递给uint64函数时,在转换为uint64之前,它们将被计算为双精度数。如果这些表达式求值为不能完全表示的双精度整数,您将看到如您所述的行为。这正是uint64(2^63-1)uint64(2^63)都返回9223372036854775808的原因。所有2的幂都可以安全地以双精度表示,因此uint64(2^63)-1uint64(2^63)-uint64(1)是您应该使用的(一旦您弄清楚其他问题)。

答案 1 :(得分:3)

我没有看到您报告的问题。在我的电脑上(64位Ubuntu12.04上的Matlab R2012b):

>> mask_fraction = uint64(9223372036854775807)

mask_fraction =

  9223372036854775807

>> uint64(2^63) - 1

ans =

  9223372036854775807

您是否可以运行较旧的Matlab版本?

我还发现'未定义的函数或方法减去...'错误有点可疑。你有其他功能的uint64别名吗?首先尝试clear uint64 ...

答案 2 :(得分:1)

从其他评论看来,Matlab在某些旧版本中没有为类uint64实现minus方法。以下丑陋的解决方法适用于R2011b:

>> bitset(intmax('uint64'), 64, 0)

ans =

  9223372036854775807

答案 3 :(得分:1)

我不知道你使用的MATLAB版本是否支持它,但这可能会有所帮助

mask_fraction = uint64(intmax('int64'))

返回

mask_fraction =
  9223372036854775807

2^63-1int64的最大值。