前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊一聊整数编码

聊一聊整数编码

作者头像
算法与编程之美
发布2019-07-17 18:13:25
5660
发布2019-07-17 18:13:25
举报

欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

问题描述

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

问题分析

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

事实真是如此吗?

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

00000000 00000000 00000000 00001010

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

(2) 假如用户A要发一个整数257给B,那么情况又是如何呢?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

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

结语

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

拓展阅读:

深入理解遗传算法(一)

深入理解遗传算法(二)

从1到100求和学算法思维(一)

从1到100求和学算法思维(二)

从1到100求和学算法思维(三)

从1到100求和学算法思维(四)

从1到100求和学算法思维(五)

从1到100求和学算法思维(六)

where2go 团队


微信号:算法与编程之美

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档