You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua中如何将字符串形式的16位有符号二进制转换为十进制?

16位有符号二进制字符串转十进制(Lua)

Lua的tonumber(bin_str, 2)会将16位二进制字符串解析为无符号整数,要处理有符号的情况,你可以通过以下两种方式实现:

方法一:补码公式计算

利用16位有符号数的补码规则,当最高位为1时,对应的十进制数等于无符号值减去2^16(即65536):

function signed16_bin_to_dec(bin_str)
    -- 校验输入是否为16位二进制字符串
    assert(#bin_str == 16, "输入必须是16位二进制字符串")
    local unsigned_val = tonumber(bin_str, 2)
    -- 判断符号位(第一位)
    if bin_str:sub(1, 1) == '1' then
        return unsigned_val - 65536
    else
        return unsigned_val
    end
end

-- 测试用例
print(signed16_bin_to_dec("1111111111111111")) -- 输出 -1
print(signed16_bin_to_dec("1000000000000000")) -- 输出 -32768
print(signed16_bin_to_dec("0111111111111111")) -- 输出 32767

方法二:位运算符号扩展

如果你的Lua版本支持位运算(Lua 5.3+ 或通过bit32库),可以用算术右移实现符号扩展,自动转换为有符号数:

Lua 5.3+ 版本

function signed16_bin_to_dec(bin_str)
    local num = tonumber(bin_str, 2)
    -- 算术右移16位后再左移,完成符号扩展
    return (num >> 16) * 65536 + num
end

Lua 5.1 版本(需加载bit32库)

require 'bit32'
function signed16_bin_to_dec(bin_str)
    local num = tonumber(bin_str, 2)
    return bit32.arshift(num, 16) * 65536 + num
end

内容的提问来源于stack exchange,提问作者cobdmg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:05:26