如何用简单的位操作实现高级算法

简介: 如何用简单的位操作实现高级算法

摄影:产品经理一小块鱼肉

我们知道,在十进制的世界里面,如果我想把3个数字:7,34,562拼接成一个长整数:734562,一般我们会这样做:

7 * 100000 + 34 * 1000 + 562 = 734562

那么在二进制的世界中,我们应该如何把三个二进制数:11110拼接为11110呢?这就涉及到移位的操作了。

在 Python 中,移位操作的符号是<<,例如我们要把1左移3位,就写为:

1 << 3

结果如下图所示:


这个数字8看起来不够直观,我们把它转成二进制看看:

bin(1 << 3)

运行结果如下图所示:

所以, 1 << 3对应二进制1000。同理,1 << n对应的二进制是1后面跟 n 个零。

那么第二个问题,现在我已经有了一个二进制数100,我怎么把另一个二进制11【拼】上去,形成111呢?这个时候,我们就可以使用或操作。在 Python 中,或操作的符号是一根竖线|。或操作满足,两个操作数中,只要有一个数是1,那么结果就是1:

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

如下图所示:

于是,如果我们把10011进行或操作,得到的结果是什么呢?我们看一下:

所以,如果要把11110拼接成11110,我们只需要通过如下代码完成:

bin(1 << (0b11).bit_length() | 0b11 << 0b10.bit_length() | 0b10)

运行效果如下图所示:

好了,理论讲完了。我们来看看上面这个理论可以用了干什么事情。

感谢 KSHMR 提供图片

现在我给你一个汉字到二进制数的对应表:

字符 二进制
00
010
011
10
110
1110
11110
; 11111

那么,对于绕口令:黑化肥发灰会挥发;灰化肥挥发会发灰,它对应的二进制数就是01001110001101110111100011111110011101111000111000110

我们在 Python 里面,看看这个二进制数对应的十进制数是多少:

我们来看看这个数字,它占用的储存空间是多少:

只占用32 byte 的内存(sys.getsizeof 返回的数据会比实际占用的空间大)。

再来看看原来绕口令字符串所占用的空间:

通过这样一个二进制的映射,我们把字符串的大小缩减为原来的30%。压缩率高达70%!

但不要忘记,如果要还原数据,我们还需要上面的汉字与二进制数的对应表。所以,需要压缩的数据越大,重复率越高,那么压缩效率就越好。

以上就是霍夫曼(Huffman)编码的基本原理了。其中字符到二进制的对应关系是通过字符出现的概率来算的,出现概率越高,它对应的二进制数就越短,这样就可以保证转换后的总二进制数最短。

如果大家对如何生成这个对应码表有兴趣,请在文章下面留言。超过一定量,我再写篇文章讲讲如何转换。

目录
相关文章
|
6月前
|
算法 C语言
【专业解码】递归求和在C语言中的神操作!只需1秒,你也能轻松开挂
【专业解码】递归求和在C语言中的神操作!只需1秒,你也能轻松开挂
|
机器学习/深度学习 存储 安全
隐语小课 | 基于秘密分享的混合比特数学运算库-SIRNN介绍
隐语小课 | 基于秘密分享的混合比特数学运算库-SIRNN介绍
324 0
|
存储 算法 调度
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(下)
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)
|
3月前
|
Python
掌握Python算术与反算术精髓,解锁编程新境界,轻松驾驭数值计算,让每一行代码都精准无误!
【8月更文挑战第22天】Python中的算术运算符如加(+)、减(-)、乘(*)、除(/)、整除(//)、取模(%)及幂运算(**)是数值计算的基础,简化了编程过程并使代码更直观。例如,可以轻松计算矩形的面积与周长。而所谓的“反算术”操作,如取反(使用负号-)和求绝对值,则能进一步处理数值结果。这些运算符是编程中不可或缺的工具,帮助我们高效且清晰地解决问题。
31 0
|
6月前
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
|
5月前
|
C语言
C语言中求x的n次方:从入门到实践(保姆式教学)
C语言中求x的n次方:从入门到实践(保姆式教学)
410 0
|
存储 安全 网络安全
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(下)
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)
|
6月前
|
C语言 C++
异或运算的骚操作,由浅入深拿捏一类型的题
异或运算的骚操作,由浅入深拿捏一类型的题
113 1
|
6月前
|
存储 机器学习/深度学习 算法
【魔法编程奇谭】:探秘C语言递归的“时空轮回术”
【魔法编程奇谭】:探秘C语言递归的“时空轮回术”
|
6月前
|
C语言
【C语言】“分⽀与循环第一章:开启创新之门,探索无尽可能性的第一篇章“2
【C语言】“分⽀与循环第一章:开启创新之门,探索无尽可能性的第一篇章“2