bitand matlab错误结果

bitand matlab wrong result

我有一个 64 位数字,必须将其分成 4 个数字,每个数字为 16 位。 我目前正在使用这种形式:

temp(ii) = fread(fd,1,'*uint64');
A(ii,1) = bitand(bitshift(temp(ii),-48),hex2dec('FFFF'));
A(ii,2) = bitand(bitshift(temp(ii),-32),hex2dec('FFFF'));
A(ii,3) = bitand(bitshift(temp(ii),-16),hex2dec('FFFF'));
A(ii,4) = bitand(temp(ii),hex2dec('FFFF'));

除最后一个外,其他人都正确。如果你取这个数字 63614152207040708 最后 16 位给出 196。Matlab 给我 192。如果我用 uint16() 或用 cast(63614152207040708, 'uint16') 转换值,结果是 65535.

Matlab 不会溢出 整数类型的运算,它只是在最小或最大级别使值饱和。所以 uint16(63614152207040708) 将始终 return 最大值 uint16 值 (=65535)。

关于字节分离,看typecast文档。它可以帮助您避免痛苦的手动位操作:

a = uint64(63614152207040708) ;

typecast( a ,'uint16')
ans =
    196    253    188    226

只看字节顺序,如果你想反转它,请使用 fliplr:

>> fliplr( typecast( a ,'uint16') )
ans =
    226    188    253    196

注意:另请注意,默认情况下 Matlab 会将每个未明确键入的数字转换为 double(64 位浮点数),因此 cast(63614152207040708, 'uint16') 不同于 cast(uint64(63614152207040708), 'uint16')。这里的结果没有什么不同,因为你超过了最大值,但它可以与其他值有所不同。例如,您的代码:

a = 63614152207040708 ; %// this is cast by default as double
A(1) = bitand(bitshift(a,-48),hex2dec('FFFF'));
A(2) = bitand(bitshift(a,-32),hex2dec('FFFF'));
A(3) = bitand(bitshift(a,-16),hex2dec('FFFF'));
A(4) = bitand(a,hex2dec('FFFF'));
A =
   226   188   253   192

不同于:

a = uint64(63614152207040708) ; %// make sure we give Matlab a uint64
A(1) = bitand(bitshift(a,-48),hex2dec('FFFF'));
A(2) = bitand(bitshift(a,-32),hex2dec('FFFF'));
A(3) = bitand(bitshift(a,-16),hex2dec('FFFF'));
A(4) = bitand(a,hex2dec('FFFF'));
A
A =
   226   188   253   196

我看到您正在使用正确的 fread 精度说明符读取 uint64,但请确保您的 temp 数组也定义为 uint64 或您的值read 被分配给 temp(ii).

后立即转换为 double