如何修改Python拼接二进制的joined函数,使其匹配0b字面量断言(禁用字符串)
问题核心原因
你当前代码的核心问题是把二进制数位按十进制规则拼接,得到的是十进制表示的「二进制外观数值」,和Python二进制字面量对应的实际整数值不匹配。比如joined(1,3)你当前返回的是十进制的11011,而断言中的0b11011对应的实际十进制值是27,二者自然不相等。
修改方案
调整拼接逻辑,直接对整数进行二进制位拼接:每拼接一个新数字前,先将现有结果左移「新数字的二进制位数」位(等价于乘以2的位数次方),再和新数字做按位或(等价于相加)即可,全程不需要字符串操作,也不需要额外将数字转成十进制格式的二进制串。
修改后完整可运行代码如下:
def get_binary_bit_count(num): # 计算数字的二进制位数,无字符串操作 if num == 0: return 1 count = 0 while num > 0: num = num >> 1 count += 1 return count def joined(start, count): result = 0 end = start + count for i in range(start, end): bit_len = get_binary_bit_count(i) # 左移对应位数后拼接新数字 result = (result << bit_len) | i return result def main(): assert joined(1, 3) == 0b11011 assert joined(10, 4) == 0b1010101111001101 assert joined(8, 5) == 0b10001001101010111100 assert joined(99, 2) == 0b11000111100100 assert joined(999, 3) == 0b111110011111111010001111101001 assert joined(1111, 1) == 0b10001010111 print("所有断言校验通过") if __name__ == "__main__": main()
逻辑验证示例(以joined(1,3)为例)
- 初始result=0,第一个数字1,二进制位数1,
result = (0<<1)|1 = 1 - 第二个数字2,二进制位数2,
result = (1<<2)|2 = 4+2=6(二进制110) - 第三个数字3,二进制位数2,
result = (6<<2)|3 =24+3=27,对应0b11011,完全匹配断言要求。
内容的提问来源于stack exchange,提问作者Petra Štěpánová
相关产品推荐
相关产品推荐

