js 10进制和16进制互换

JavaScript十进制与十六进制转换
     /**
         * 将补码形式的十六进制字符串转换为十进制整数
         * @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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值