/**
* 将补码形式的十六进制字符串转换为十进制整数
* @param {string} hexStr 补码形式的十六进制字符串
* @param {number} bits 位数(必须是8的倍数:8/16/32/64)
* @returns {number | bigint} 十进制整数
*/
function fromHex(hexStr, bits = 16) {
if (bits <= 0 || bits % 8 !== 0) {
throw new Error("位数必须是 8 的倍数,例如 8、16、32、64");
}
let bigNum = BigInt("0x" + hexStr);
let max = 2n ** BigInt(bits);
let half = max / 2n;
// 如果数 >= 2^(bits-1),说明是负数(补码规则)
if (bigNum >= half) {
return Number(bigNum - max);
}
return Number(bigNum);
}
// ✅ 示例
// -5
console.log(fromHex("FE5F", 16)); //-417
/**
* 将十进制数转换为补码形式的十六进制字符串
* @param {number} num 输入的整数
* @param {number} bits 位数(常用 8、16、32、64)
* @returns {string} 对应的十六进制字符串
*/
function toHex(num, bits = 16) {
if (!Number.isInteger(num)) {
throw new Error("只支持整数");
}
if (bits <= 0 || bits % 8 !== 0) {
throw new Error("位数必须是 8 的倍数,例如 8、16、32、64");
}
// 处理范围:限制在指定位数内
let max = 2n ** BigInt(bits); // 最大值
let bigNum = BigInt(num);
// 如果是负数,转成补码(num + 2^bits)
if (bigNum < 0) {
bigNum = max + bigNum;
}
// 转十六进制,前面补零
let hex = bigNum.toString(16).toUpperCase();
let width = bits / 4; // 每 4 位二进制 = 1 个十六进制
return hex.padStart(width, "0");
}
// ✅ 示例
console.log(toHex(-255, 16)); // FF01
js 10进制和16进制互换
JavaScript十进制与十六进制转换
最新推荐文章于 2025-11-05 11:04:33 发布
2802

被折叠的 条评论
为什么被折叠?



