文章目录

  • 一:zigzag压缩算法出现的必要性
  • 二:步骤
  • 三:举例

涉及到原码和补码的知识点,可参考:
原码,反码,补码之详解

一:zigzag压缩算法出现的必要性

一般我们用到的整数都是比较小的,这类的整数转换成二进制之后,高位绝大部分是0,就比如整数1 ,二进制为0000 0001。那么很多的压缩算法就是利用高位无效0值来实现压缩的。例如Varints
但是这种压缩算法往往对负数很不友好,因为负数的高位是1,1在二进制中是有意义的存储,所以不能省略进行压缩
所以就有了zigZag压缩算法,一种对负数友好的压缩算法

二:步骤

zigZag压缩算法简单的来说,就是在二进制补码中将符号位移到最后一位,其他位左移;除了最后一位符号位,其他位取反然后进行压缩
分步骤详解:

  1. 补码将符号位移到最后一位。对于位运算相当于n>>31。

    • 如果是正数的话,移动之后为0000 0000 0000 0000 0000 0000 0000 0000。因为对于符号位,0表示正数,所以最后一位是0,正数的右移位运算时左边空出的高位补0
    • 如果是负数的话,移动之后为1111 1111 1111 1111 1111 1111 1111 1111。因为对于符号位,1表示的是负数,所以最后一位是1,负数的右移位运算是左边空出的高位补1
  2. 数值位左移1位。相当于是n<<1
    不管是正数还是负数,左移1位之后右边的空位都补0。

    • 对于数值较小的正数来说,补码=反码=原码。那么高位大部分都是便于压缩的0,类似于000… xxxx
    • 对于绝对值较小的负数来说,补码的高位大部分都是1,类似于111…xxx
  3. 所以如果我们对1和2的结果做^操作的话,就会有

    • 对于正数:(0000 0000 0000 0000 0000 0000 0000 0000)^(000… xxxx)=000… xxxx
    • 对于负数:(1111 1111 1111 1111 1111 1111 1111 1111)^(111…xxx)=000… yyyy

    所以不管是正数还是负数,对于数值n, (n <<1) ^ (n >>31)这个表达式的结果一定是最便于进行压缩的,因为他的高位很大可能是0。abs(n)越小,结果中高位0的个数越多,越容易压缩

三:举例

用十进制-300来举例说明
原码:1000 0000 0000 0000 0000 0001 0010 1100
反码:1111 1111 1111 1111 1111 1110 1101 0011
补码:1111 1111 1111 1111 1111 1110 1101 0100

  1. 将补码符号位移到最后一位,其他位左移
    补码:1111 1111 1111 1111 1111 1110 1101 0100
    移动之后:111 1111 1111 1111 1111 1110 1101 01001

  2. 可以看到移动之后,因为负数补码本身就是原码上取反加工而成的,所以对数值比较小的二进制来说,高位大概率是1
    所以可以除了最后一位符号位,其他位取反
    before:111 1111 1111 1111 1111 1110 1101 01001
    after: 000 0000 0000 0000 0000 0001 0010 10111

  3. 这样我们看到高位大部分是0,那么就可以进行Varints压缩了

数据压缩算法之zigZag--一种对负数友好的编码(2000多字总结)相关推荐

  1. zstd - 一种由Facebook使用的快速数据压缩算法

    Zstandard是一个快速的实时无损数据压缩算法和压缩工具,它提供了由Facebook开发的高压缩比. 分类:Linux命令操作系统  2018-06-09 00:00:00 Zstandard ( ...

  2. zstd安装_zstd - 一种由Facebook使用的快速数据压缩算法

    Zstandard (也被称为zstd )是一款免费的开源,快速实时数据压缩程序,具有更好的压缩比,由Facebook开发. 它是用C语言编写的无损压缩算法 (在Java中有一个重新实现) - 因此它 ...

  3. 5种数据压缩算法实现和性能测试

    目录 算法实现 Deflate GZIP LZO LZ4 Snappy 数据压缩算法性能测试 准备工作 测试 压缩算法原理可看我上一篇文章:数据压缩算法原理 算法实现 Deflate 一个基于LZ77 ...

  4. 基于JPEG压缩编码的数据压缩算法的研究与实现(转)

    基于JPEG压缩编码的数据压缩算法的研究与实现(转) 编辑器加载中... JPEG压缩方法由于其较高的压缩比和理想的压缩效果,是目前应用最广泛的图像压缩方法.它采用一种特殊的有损压缩算法,将不易被人眼 ...

  5. c 数据压缩算法_CCSDS图像压缩算法之我见(一)

    点击上方蓝字关注我们! CCSDS图像压缩算法之我见 CCSDS:Consultative Committee for Space Data System,国际空间数据系统咨询委员会,于1982年NA ...

  6. c 数据压缩算法_Redis存储总是心里没底?你大概漏了这些数据结构原理

    一.Redis内存数据结构与编码 想要弄清楚Redis内部如何支持5种数据类型,也就是要弄清Redis到底是使用什么样的数据结构来存储.查找我们设置在内存中的数据. 虽然我们使用5种数据类型来缓存数据 ...

  7. lz78算法c语言,LZW数据压缩算法研究

    内容介绍 LZW数据压缩算法研究 46页 3.2万字 摘 要 随着信息化技术的蓬勃发展,日常需要处理或者传输的数据越来越多,数据的压缩也就变得越来越重要了.我们迫切的需要有好的压缩算法来支持我们的数据 ...

  8. 数据压缩算法综述(摘录)

    <笨笨数据压缩教程>是我在1998年因工作需要研究压缩算法时写的文章(算是一种工作笔记吧,其中难免有许多疏漏),1999年初随着项目变迁,就把压缩技术的研究暂时搁置了.从那以后,一是工作太 ...

  9. java实现lz77算法实例_数据压缩算法---LZ77算法 的分析与实现

    LZ77简介 Ziv和Lempel于1977年发表题为"顺序数据压缩的一个通用算法(A Universal Algorithm for Sequential Data Compression ...

最新文章

  1. python自然语言处理.词性标注
  2. samba服务器详解
  3. JQuery之ajax异步请求Django后端
  4. 范围for语句的整理
  5. python下载邮箱附件_基于Python3 下载邮箱附件,并解压到指定文件夹
  6. UVa 10905 孩子们的游戏
  7. 前端学习(595):使用network进行详细分析
  8. RDD(弹性分布式数据集)
  9. opencv roberts算子_图像之HOG特征描述算子-行人检测
  10. 从数据传输速率的视角思考信道利用率
  11. 分布式系统如何设计,看看Elasticsearch是怎么做的
  12. 远程复制无法读取源文件或磁盘
  13. 计算机网络简单理解总结
  14. 拓嘉辰丰电商:拼多多推广主要有哪些模式
  15. 【cdq分治】cdq分治与整体二分学习笔记Part2.cdq分治
  16. 飞飞cms添加广告html,飞飞cms影视系统 安装说明飞飞影视系统 建站流程
  17. Python爬虫解析当红网剧之《我是余欢水》
  18. 动态头像 Android 实现,Android开发中实现一个头像滑动变大变小功能
  19. zeroTier实现内网穿透-moon服务搭建
  20. 多径 matlab,matlab多径效应大作业

热门文章

  1. guid主分区表损坏如何处理_GUID格式GPT硬盘引导损坏了怎么修复
  2. Linux安装 VMware tools 工具的方法(转,已测试成功)
  3. 一元多项式加减乘实现c/c++
  4. 有哪些适合在家做的正规兼职工作
  5. 关于CultureInfo
  6. 最新游戏陪玩语音聊天系统源码+视频搭建教程
  7. 在数据库中,视图有什么用?什么时候需要用到视图?
  8. QQ自定义个人文件夹
  9. linux定时启动服务
  10. 史上最全的APP推广模式及方法技巧