原因
需要对一个数字矩阵进行一个数据的归一化,把十进制数最终转化成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还得一位一位的判断,上面的代码我没有写完,发现实在是太麻烦了。
最优的方法
这是网上找到的分享,其实道理很简单,就是负数和正数相加得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就可以了转换成原数值(负数)对应的十六进制。