js实现十六进制转换单&双精度浮点数

1 篇文章 0 订阅



一、JS处理32位整型位运算?

示例:在JS中无论是整数还是小数都是按照64位的浮点数形式存储,而整数运算会自动转化为32位有符号整数。
有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数。数值范围为 [-2^31 , 2^31-1], 即[ -2147483648 , 2147483647 ]。
JavaScript 进行位操作时,采用32位有符号整型,这意味着其转换的结果也是32位有符号整型。 有时我们进行移位会由于符号的存在产生与c语言无符号整数不一样的结果。
针对该问题,我们可以把JavaScript 中的有符号数,转换成无符号数。只需要进行 >>>0 移位操作就好了。

二、js 16进制转浮点数

1. 4字节16进制转单精度浮点数

代码如下(示例):

function hexToSingle(num){
	var a = num;
	var b = parseInt(a,16);
	var s = (b&0x80000000) ? -1 : 1;
	var e = (b&0x7f800000)/0x800000-127;
	var c = (b&0x7fffff)/0x800000;
	var re = s*(1+c)*Math.pow(2,e);
	return re;
}
例如
const str = '42a0774c'
hexToSingle(str) = 80.23300170898438(js浮点数可能有误差)

2. 8字节16进制转双精度浮点数

代码如下(示例):

function HexToDouble(ca2){
    var t = parseInt(ca2,16).toString(2);
	if (t.length < 64) {
	    t = FillString(t, "0", 64, true);
	};
	var s = t.substring(0, 1);
	var e = t.substring(1, 12);
	var m = t.substring(12);
	e = parseInt(e, 2) - 1023;
	m = "1" + m;
	if (e >= 0) {
	    m = m.substring(0, e + 1) + "." + m.substring(e + 1)
	}
	else {
	    m = "0." + FillString(m, "0", m.length - e - 1, true)
	}
	if (m.indexOf(".") == -1) {
	    m = m + ".0";
	}
	var a = m.split(".");
	var mi = parseInt(a[0], 2);
	var mf = 0;
	for (var i = 0; i < a[1].length; i++) {
	    mf += parseFloat(a[1].charAt(i)) * Math.pow(2, -(i + 1));
	}
	m = parseInt(mi) + parseFloat(mf);
	if (s == 1) {
	    m = 0 - m;
	}
	return m;
}
function FillString(t, c, n, b) {
    if ((t == "") || (c.length != 1) || (n <= t.length)) {
        return t;
    }
    var l = t.length;
    for (var i = 0; i < n - l; i++) {
        if (b == true) {
            t = c + t;
        }
         else {
            t += c;
        }
    }
    return t;
}
例如
var str = "40dd7ac4b41562f9";
HexToDouble(x) = 30187.073491428047 (js浮点数可能有误差)

贴上参考的文章
https://blog.csdn.net/u014322206/article/details/84745987;
https://bbs.csdn.net/topics/391956637;
https://www.cnblogs.com/ampedZ/p/HexToSingle.html;

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值