我有一个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。
答案 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)
。