栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

[简单的算法] 整数变成布尔组 用python实现

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[简单的算法] 整数变成布尔组 用python实现

文章目录
  • 前言
  • 实现原理
    • 一个人尽皆知的算法
    • 类比
    • 动手
  • 优化
  • 总结

前言

如果要用socket传输一系列的数据,有大量的bool类型的数据时,可以怎么压缩?
这里有一种简单的压缩!(以及解压缩)

实现原理 一个人尽皆知的算法

这是一道简单到不能再简单的入门题了:

给一个数字,输出它每一位上的数字

这很简单,对吧?只要把把它不停对10取余并砍掉个位即可。

类比

12345变成1 2 3 4 5
那么我们也可以让10100变成1 0 1 0 0
既然每一位只储存两种数字,那么就可以把它变成整数,用2代替10.

动手

有了上面的代码很快就能写好:

def int2bool_notsafe(num):
    lst = []
    while num>0:
        lst.append(bool(num%2))
        num //= 2
    lst.reverse()
    return lst
def bool2int_notsafe(bools):
    num = 0
    for b in bools:
        num += b
        num *= 2
    num //= 2
    return num
优化

写是写好了,但结果不好。理论上,int2bool(bool2int(bools)) == bools应该是为真的,但是并不一定。当bools列表是以False开头时,高位就会因为0而截掉。解决方法也很简单,在开头补1即可。

def int2bool(num):
    lst = []
    while num>0:
        lst.append(bool(num%2))
        num //= 2
    lst.reverse()
    return lst[1::]        # [1]
def bool2int(bools):
    bools = (True, *bools) # [2]
    num = 0
    for b in bools:
        num += b
        num *= 2
    num //= 2
    return num

【1】 把列表中多补的1去掉
【2】在可能以False开头的bool列表开头补上True,合成新元组

总结

写完代码不要高兴的太早

本文发于CSDN于 2022/8/4 16:27

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1034296.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号