bitand matlab错误的结果

时间:2015-07-08 17:02:39

标签: matlab bit-manipulation

我有一个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()或使用强制转换(63614152207040708,'uint16')转换值,结果为65535。

1 个答案:

答案 0 :(得分:2)

Matlab不对整数类型执行溢出操作,它只是将值在最小或最大级别饱和。因此uint16(63614152207040708)将始终返回最大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,或者您读取的值是一旦分配到double,就转换为temp(ii)