Matlab 负数转换十六进制,简单实用

原因

需要对一个数字矩阵进行一个数据的归一化,把十进制数最终转化成3个比特的十六进制,也就是24位的数。

直接用 函数

dec2hex()

因为有负数和小数的存在,需要额外的处理,小数还比较好解决,根据设计,直接四舍五入取整就好,不需要保留小数。对于负数转十六进制,matlab没有相关的函数可以直接转换。

原理

一个是在计算机中表达,一个是科学计数方式表达。

714 原码: 0000 0010 1100 1010 02CA

-714的原码: 1000 0010 1100 1010

负数的反码:1111 1101 0011 0101(符号位不变)

负数的补码:1111 1101 0011 0110 FD36

-714计算机储存式: 1111 1101 0011 0110

下面为:由正数原码求负数的计算机储存式。

-714

714 化成16进制 02CA,二进制

0000 0010 1100 1010

取反(不是反码,正数的反码是本身)

1111 1101 0011 0101

加1

1111 1101 0011 0110

FD36

负数转16进制,其正数取反码+1,即可。

如果按照上面的思路,就需要先取反码,然后+1,才能得到一个负数的十六进制。

%     if coeff2row(fix(jj/3) + 1) < 0
%         temp = abs(coeff2row(fix(jj/3) + 1));
%         tempbin = dec2bin(temp, 24);
%         a = tempbin(3);
%         for x = 1:24
%             if tempbin(x) == '0'
%                 tempbin(x) = '1';
%             else
%                 tempbin(x) = '0';
%             end
%         end
%         %然后对tempbin+1
%         .......
%         tempdec = bin2dec(tempbin);
%     end

想法很美好,取反得一个一个的取…

+1还得一位一位的判断,上面的代码我没有写完,发现实在是太麻烦了。

最优的方法

Matlab 负数转换十六进制,简单实用
这是网上找到的分享,其实道理很简单,就是负数和正数相加得0,对于十六进制也是如此。

我的数据需要是3比特24位的数值,所以范围是 0~0xFFFFFF,转换成十进制也就是0 ~16777215,即一共16777216个数。

比如这两个数

14680064

-2097152

可以很轻松的发现
14680064 + 2097152 = 16777216

16777216对应的16进制0x1000000,因为我们是三个字节,所以最高位溢出,也就是0。

如果我是要求 -2097152的十六进制,那么直接使用

coeff2row(find(coeff2row<0))=coeff2row(find(coeff2row<0))+16777216;

这样就可以得到一个正的十进制数,这个十进制数直接进行dec2hex就可以了转换成原数值(负数)对应的十六进制。

上一篇:714. 买卖股票的最佳时机含手续费-动态规划


下一篇:4.7Python数据处理篇之Matplotlib系列(七)---Figure的学习