# quickest way to convert hex to a 16 bit signed integer

조회 수: 13(최근 30일)
Robert Scott 2021년 7월 29일
댓글: Walter Roberson 2021년 8월 6일
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표시숨기기 없음
James Tursa 2021년 7월 29일
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?

댓글을 달려면 로그인하십시오.

### 채택된 답변

Walter Roberson 2021년 7월 29일
편집: Walter Roberson 2021년 7월 31일
format long g
N = 100000;
HC = ['0':'9', 'A':'F'];
data = HC(randi(16, N, 4));
timeit(@() typecast(uint16(hex2dec(data)),'int16'), 0)
ans =
0.078666781
timeit(@() typecast(uint16(sscanf(data.', '%4x')),'int16'), 0)
ans =
0.010088781
timeit(@() typecast(cell2mat(textscan(strjoin(cellstr(data),'\n'),'%xu16')),'int16'), 0)
ans =
0.114500781
timeit(@() cell2mat(textscan(strjoin(cellstr(data),'\n'),'%xs16')), 0)
ans =
0.114293781
timeit(@() via_ismember_typecast(data, HC), 0)
ans =
0.003229781
timeit(@() via_ismember_no_typecast(data, HC), 0)
ans =
0.004451781
timeit(@() via_math_typecast(data, HC), 0)
ans =
0.005474781
timeit(@() via_discretize_typecast(data, HC), 0)
ans =
0.005370781
timeit(@() via_lookup_typecast(data,HC), 0)
ans =
0.001278781
function num = via_ismember_no_typecast(data, HC)
[~, dec] = ismember(data, HC);
num = dec(:,1)*4096 + dec(:,2)*256 + dec(:,3) * 16 + dec(:,4);
num = int16(num);
end
function num = via_ismember_typecast(data, HC)
[~, dec] = ismember(data, HC);
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';
num = typecast(uint16(dec(:,1)*4096 + dec(:,2)*256 + dec(:,3) * 16 + dec(:,4)),'int16');
end
function num = via_discretize_typecast(data, HC)
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표시숨기기 이전 댓글 수: 5
Walter Roberson 2021년 8월 6일
To clarify the chars represent hex, so even though two chars takes 4 bytes of storage, two char is encoding one byte.

댓글을 달려면 로그인하십시오.

R2020b

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by