quickest way to convert hex to a 16 bit signed integer
84 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Robert Scott
le 29 Juil 2021
Commenté : Walter Roberson
le 6 Août 2021
looking for the quickest way to convert 16 bit hex into a singed 16 bit int
performance is key here.
I was doing it with a type cast before but appears very slow
Anyone have any ideas?
1 commentaire
James Tursa
le 29 Juil 2021
Please provide details of exact input and desired output. Is the hex in a char array? What size? What is the exact code you have tried so far?
Réponse acceptée
Walter Roberson
le 29 Juil 2021
Modifié(e) : Walter Roberson
le 31 Juil 2021
format long g
N = 100000;
HC = ['0':'9', 'A':'F'];
data = HC(randi(16, N, 4));
timeit(@() typecast(uint16(hex2dec(data)),'int16'), 0)
timeit(@() typecast(uint16(sscanf(data.', '%4x')),'int16'), 0)
timeit(@() typecast(cell2mat(textscan(strjoin(cellstr(data),'\n'),'%xu16')),'int16'), 0)
timeit(@() cell2mat(textscan(strjoin(cellstr(data),'\n'),'%xs16')), 0)
timeit(@() via_ismember_typecast(data, HC), 0)
timeit(@() via_ismember_no_typecast(data, HC), 0)
timeit(@() via_math_typecast(data, HC), 0)
timeit(@() via_discretize_typecast(data, HC), 0)
timeit(@() via_lookup_typecast(data,HC), 0)
function num = via_ismember_no_typecast(data, HC)
[~, dec] = ismember(data, HC);
num = dec(:,1)*4096 + dec(:,2)*256 + dec(:,3) * 16 + dec(:,4);
mask = num > 32767;
num(mask) = num(mask) - 65536;
num = int16(num);
end
function num = via_ismember_typecast(data, HC)
[~, dec] = ismember(data, HC);
dec = dec-1; %bin numbers start with 1
num = typecast(uint16(dec(:,1)*4096 + dec(:,2)*256 + dec(:,3) * 16 + dec(:,4)),'int16');
end
function num = via_math_typecast(data, HC)
dec = data - '0';
mask = dec>9;
dec(mask) = dec(mask) - 7;
num = typecast(uint16(dec(:,1)*4096 + dec(:,2)*256 + dec(:,3) * 16 + dec(:,4)),'int16');
end
function num = via_discretize_typecast(data, HC)
dec = discretize(double(data), double(HC)) - 1; %bin numbers start with 1
num = typecast(uint16(dec(:,1)*4096 + dec(:,2)*256 + dec(:,3) * 16 + dec(:,4)),'int16');
end
function num = via_lookup_typecast(data, HC)
lookup(HC) = 0:15;
dec = lookup(data);
num = typecast(uint16(dec(:,1)*4096 + dec(:,2)*256 + dec(:,3) * 16 + dec(:,4)),'int16');
end
So via_lookup_typecast is the fastest of these, and via_ismember_typecast is second fastest out of all of these possibilities.
If you are doing a lot of these conversions, then the lookup table can be precomputed -- and it is easy to extend the lookup table to handle lowercase as well as upper case.
6 commentaires
Walter Roberson
le 6 Août 2021
To clarify the chars represent hex, so even though two chars takes 4 bytes of storage, two char is encoding one byte.
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Numeric Types dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!