聊一聊整数编码

简介: 聊一聊整数编码

1. 问题描述

网络上有两个用户AB,用户A想要向B发送一个4字节的整形数据,请问A应该怎么做呢?

 

2. 分析

大家第一眼看到这个问题的时候,是不是都觉得这个问题特别简单。对于大多数机器来说,一个int所占的空间一般都是4Byte,那么用户A直接发一个4Byte的整形数据给用户B不就可以了吗?这种问题有什么好分析的呢。

 

事实真是如此吗?

 

1)假如用户A要发一个整数10B,我们来分析一下这种情况。10对应的二进制如下所示:

00000000        00000000        00000000        00001010

 

从上面的示意图,我们不难得出,整数10只需要一个字节就可以了,而前面的3个字节全是0,即完全没有任何用处,浪费了!!!

 

2) 假如用户A要发一个整数257B,那么情况又是如何呢?257对应的二进制如下:

00000000        00000000        00000001        00000001

1)同样的情况,257并不需要4个字节,而是只要两个字节就可以了。

 

1)和2)的分析,相信聪明的你,已经看出端倪了,我们不需要对于任意的整数都分配4个字节,而是有的整数需要1个字节,有的需要2个字节,有的需要...

 

既然我们已经分析出问题所在了,那么有没有什么方法可以做到这一点呢?

 

我们设置每一个字节的最高位用作标志位,如果为1表示后面还有字节,如果为0表示这是最后一个字节,故每一个字节只有7位是有效的。

 

接下来我们举几个例子来说明一下这个思想。

1)用户A发了一个字节给B

0000 1010

 

用户B在收到第一个字节后,检查该字节的最高位,发现是0,表示这是最后一个字节,去掉最高位后,得到0001010再将二进制转化为十进制得到整数10

 

2)用户A发了两个字节给B:

1001 0110       0000 0001

 

第一个字节的最高位为1,表示后面还有字节,第二个字节的最高位为0,表示这是整数的最后一个字节。

> 1001 0110    0000 0001       //去掉最高位后,逆序所有的7位二进制组

> 0000 001      001 0110

> 2+4+16+128 = 150

 

通过每一个字节的最高位来判断该字节是不是整数的最后一个字节,利用这种方法来给不同的整数设计不同的空间大小,从而进一步提高整数的空间存储效率,降低网络传输开销。

 

3. 结论

不同的整数所占的空间是不一样的,通过设计一种算法,使得每一个整数都使用自己需要的字节数,而不是统一的4个字节。

 

上面的算法您理解了吗?有什么疑问欢迎留言。

目录
相关文章
|
2月前
|
自然语言处理 Rust 算法
【算法】13. 罗马数字转整数(多语言实现)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 | 字符 | 数值 | |--|--| | I | 1 | | V | 5 | | X | 10 | | L | 50 | | C | 100 | | D | 500 | | M | 1000 | 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1
【算法】13. 罗马数字转整数(多语言实现)
|
11月前
|
设计模式 算法 程序员
高端程序员的朴素编码方式解析
在互联网信息技术飞速发展的今天,程序员这一职业也一直受到社会的重视和关注,不仅是因为程序员有着相对来说的高薪,而且还有程序员单调且良好的工作、生活习惯。但在程序员群体中,高端程序员无疑是最受关注的一种,高端程序员不仅有着丰富的经验和技术,而且在编码方面也有着自己独特的编码方式和思想。那么接下来本文就来分享一下高端程序员所具备的低调之处,以及高端程序员的朴素编码方式。
125 1
高端程序员的朴素编码方式解析
|
2月前
|
机器学习/深度学习 算法 C语言
【编码狂想】深度探索C++编程之旅:“数组、字符串、函数与KMP算法解密“
【编码狂想】深度探索C++编程之旅:“数组、字符串、函数与KMP算法解密“
84 0
|
2月前
|
存储 C++
【软件设计师备考 专题 】数制基础:二进制、十进制和十六进制的理解与转换
【软件设计师备考 专题 】数制基础:二进制、十进制和十六进制的理解与转换
17 1
|
2月前
|
Python Java Go
Python每日一练(20230409) 字符串拆分数值求和、快乐数、格雷编码
Python每日一练(20230409) 字符串拆分数值求和、快乐数、格雷编码
53 0
Python每日一练(20230409) 字符串拆分数值求和、快乐数、格雷编码
|
2月前
|
自然语言处理 Rust 算法
【算法】12. 整数转罗马数字(多语言实现)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而
|
9月前
|
存储 算法 索引
【每日挠头算法题(3)】字符串解码|数组中重复的数字
【每日挠头算法题(3)】字符串解码|数组中重复的数字
|
存储 算法 Java
【算法】阿里面试题-编码实现20亿个整数,找出某个数X是否存在其中
【算法】阿里面试题-编码实现20亿个整数,找出某个数X是否存在其中
【算法】阿里面试题-编码实现20亿个整数,找出某个数X是否存在其中
|
存储 C语言
【C语言_复习_学习第二课】什么是进制?进制之间应该如何转换
什么是进制?在我们的生活中处处充满进制,一天是24个小时、一个小时是60分钟、一分钟是60秒、一个星期一共7天........还有大家听说过半斤八两这个词语吗?也就是说买半斤东西也就是八两,一斤也就是十六两,满16进一位这就是十六进制。我今天就当一次小学老师来考考你,5+8等于多少(我没有在和大家开玩笑)你会说等于13,你的回答就是十进制也就是满十进一,而在计算机中数字都是以二进制(只有1和0)存储的也就是满二进一位,当然也有八进制(从0到7)、十六进制(从0到F)都是类似的,八进制满八进一位,十六进制满十六进一位(其中十六进制10用A来表示,11-B、12-C、13-D、14-E、15-F)
88 0
|
Rust 自然语言处理 算法
【算法】1281. 整数的各位积和之差(多语言实现)
给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。
【算法】1281. 整数的各位积和之差(多语言实现)