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
相关产品推荐
相关产品推荐

