如何在Python中计算Two's (2's) Complement(二进制补码)
Python实现舵机驱动二进制补码转换
直接适配舵机驱动协议的补码计算方案,输入带符号整数直接输出符合要求的十六进制结果:
def servo_value_to_hex(signed_val: int, bit_width: int = 16) -> tuple[str, str]: """ 输入舵机控制的带符号整数值,返回(16位补码十六进制, 低8位十六进制) 返回结果均为大写,无0x前缀 """ # 利用取模运算直接得到指定位宽补码对应的无符号值,无需手动取反加1 unsigned_val = signed_val % (1 << bit_width) full_hex = f"{unsigned_val:0{bit_width//4}X}" low8_hex = full_hex[-2:] return full_hex, low8_hex
使用示例
# 对应需求里的-100测试用例 full_hex, low_byte_hex = servo_value_to_hex(-100) print(full_hex) # 输出: FF9C print(low_byte_hex) # 输出: 9C
逻辑说明
- 计算逻辑完全匹配补码规则:指定位宽下,负数对
2^位宽取模的结果,就是该数补码对应的无符号整数值,不需要额外写取反、加1的分支判断 - 默认位宽16位,对应舵机常用的双字节控制指令格式,输出的4位十六进制和截断的低2位十六进制都满足使用要求
- 如果协议要求小写十六进制,把格式化字符串里的
X替换为x即可 - 若后续需要适配其他位宽的指令格式,修改
bit_width入参即可,比如8位补码传8、32位补码传32
参考规则

内容的提问来源于stack exchange,提问作者Iver
相关产品推荐
相关产品推荐

