Clear Filters
Clear Filters

How do I convert a column in an array that have 18-bit singed integer to 32-bit?

6 views (last 30 days)
I have an array with time and data that I'm trying to plot, but the problem I'm running into is that the data is a 18-bits signed. What is the best way to convert the 18-bit signed data to 32-bit signed data that can be easily processed?
I have tried converting it to a binary string and then using something like b=[a([1 1 1 1 1 1 1 1 1 1 1 1 1 1]) a] where "a" is 18 bit long binary string, and then converting it back to int32 with k = typecast(uint32(bin2dec(b)),'int32'); , but I'm not sure how to do this for a whole array. Could I use cellfun somehow? Is there a better way to approach this?
  3 Comments
Steven Settle
Steven Settle on 28 Apr 2022
This is an excerpt from the table:
'09:13:29.046431' '0X7FC48'
'09:13:29.096431' '0X7FC48'
'09:13:29.146432' '0X7FC48'
'09:13:29.196432' '0X7FC48'
'09:13:29.246432' '0X7FC48'
'09:13:29.296432' '0X7FC48'
'09:13:29.346433' '0X7FC48'
'09:13:29.396433' '0X7FC48'
'09:13:29.446433' '0X7FC48'
'09:13:29.496433' '0X7FC48'
'09:13:29.546434' '0X7FC48'
Where '0X7FC48' should be right shifted one and then it will equal -480. It's initially a .txt with a lot of information and I import it to a table where I removed the information I don't need.
Walter Roberson
Walter Roberson on 29 Apr 2022
S = '0X7FC48';
bit18 = sscanf(S, '%i')/2
bit18 = 261668
bit18bin = dec2bin(bit18, 18)
bit18bin = '111111111000100100'
N = 18;
mask = bit18>=2^(N-1)
mask = logical
1
bit32 = bit18
bit32 = 261668
bit32(mask) = bit32(mask) - 2^N
bit32 = -476
dec2bin(-480, 18)
ans = '111111111000100000'
Your example does not represent -480, it represents -476

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 25 Apr 2022
N = 18;
mask = bit18>=2^(N-1);
bit32 = bit18;
bit32(mask) = bit32(mask) - 2^N;

More Answers (0)

Products


Release

R2021a

Community Treasure Hunt

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

Start Hunting!