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
我有一个 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