当前位置: 首页 > news >正文

B3870 [GESP202309 四级] 变长编码

[GESP202309 四级] 变长编码

题目描述

小明刚刚学习了三种整数编码方式:原码、反码、补码,并了解到计算机存储整数通常使用补码。但他总是觉得,生活中很少用到 2 31 − 1 2^{31}-1 2311 这么大的数,生活中常用的 0 ∼ 100 0\sim 100 0100 这种数也同样需要用 4 4 4 个字节的补码表示,太浪费了些。
热爱学习的小明通过搜索,发现了一种正整数的变长编码方式。这种编码方式的规则如下:

1 . 对于给定的正整数,首先将其表达为二进制形式。例如, ( 0 ) { 10 } = ( 0 ) { 2 } (0)_{\{10\}}=(0)_{\{2\}} (0){10}=(0){2} ( 926 ) { 10 } = ( 1110011110 ) { 2 } (926)_{\{10\}}=(1110011110)_{\{2\}} (926){10}=(1110011110){2}

2 . 将二进制数从低位到高位切分成每组 7 7 7 bit,不足 7 7 7bit 的在高位用 0 0 0 填补。例如, ( 0 ) { 2 } (0)_{\{2\}} (0){2} 变为 0000000 0000000 0000000 的一组, ( 1110011110 ) { 2 } (1110011110)_{\{2\}} (1110011110){2} 变为 0011110 0011110 0011110 0000111 0000111 0000111 的两组。

3 . 由代表低位的组开始,为其加入最高位。如果这组是最后一组,则在最高位填上 0 0 0,否则在最高位填上 1 1 1。于是, 0 0 0 的变长编码为 00000000 00000000 00000000 一个字节, 926 926 926 的变长编码为 10011110 10011110 10011110 00000111 00000111 00000111 两个字节。

这种编码方式可以用更少的字节表达比较小的数,也可以用很多的字节表达非常大的数。例如, 987654321012345678 987654321012345678 987654321012345678 的二进制为 ( 0001101 1011010 0110110 1001011 1110100 0100110 1001000 0010110 1001110 ) { 2 } (0001101 \ 1011010 \ 0110110 \ 1001011 \ 1110100 \ 0100110 \ 1001000 \ 0010110 \ 1001110)_{\{2\}} (0001101 1011010 0110110 1001011 1110100 0100110 1001000 0010110 1001110){2},于是它的变长编码为(十六进制表示) CE 96 C8 A6 F4 CB B6 DA 0D,共 9 9 9 个字节。

你能通过编写程序,找到一个正整数的变长编码吗?

输入格式

输入第一行,包含一个正整数 N N N。约定 0 ≤ N ≤ 1 0 18 0\le N \le 10^{18} 0N1018

输出格式

输出一行,输出 N N N 对应的变长编码的每个字节,每个字节均以 2 2 2 位十六进制表示(其中, A-F 使用大写字母表示),两个字节间以空格分隔。

样例 #1

样例输入 #1

0

样例输出 #1

00

样例 #2

样例输入 #2

926

样例输出 #2

9E 07

样例 #3

样例输入 #3

987654321012345678

样例输出 #3

CE 96 C8 A6 F4 CB B6 DA 0D

题目解析

题目描述:
给定一个非负整数N,将其按照变长编码的规则进行编码。变长编码的规则如下:

  1. 对于给定的正整数,首先将其表达为二进制形式。
  2. 将二进制数从低位到高位切分成每组7bit,不足7bit的在高位用0填补。
  3. 由代表低位的组开始,为其加入最高位。如果这组是最后一组,则在最高位填上0,否则在最高位填上1。
  4. 将每一组转换为一个字节,字节的高4位和低4位分别对应十六进制数的一位。
  5. 将所有字节按照从低位组到高位组的顺序输出,字节之间用空格分隔。

解题思路:

  1. 使用vector<uint8_t>存储编码结果的字节。
  2. 对N进行循环处理,直到N为0:
    • 取N的低7位,记为byte。
    • 将N右移7位。
    • 如果N不为0,说明还有更高位的字节,将byte的最高位设为1。
    • 否则,将more标志设为false,表示已经处理完最后一个字节。
    • 将byte添加到结果vector中。
  3. 遍历结果vector,输出每个字节的十六进制表示:
    • 如果不是第一个字节,在前面添加一个空格。
    • 以十六进制格式输出字节,使用大写字母,宽度为2,不足的在前面补0。
  4. 输出换行符。

C++代码实现:

#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;void encodeVarint(uint64_t N) {vector<uint8_t> result;bool more = true;while (more) {uint8_t byte = N & 0x7F; // 取低7位N >>= 7;if (N != 0) {byte |= 0x80; // 不是最后一个字节,最高位填1} else {more = false; // 最后一个字节,最高位填0}result.push_back(byte);}for (size_t i = 0; i < result.size(); ++i) {if (i > 0) {cout << " ";}cout << hex << uppercase << setw(2) << setfill('0') << (int)result[i];}cout << endl;
}int main() {uint64_t N;cin >> N;encodeVarint(N);return 0;
}

代码解释:

  1. encodeVarint函数接受一个无符号64位整数N,表示要编码的非负整数。
  2. 定义resultuint8_t类型的vector,用于存储编码结果的字节。
  3. 定义more为布尔类型,初始值为true,表示是否还有更多字节需要处理。
  4. 进入循环,直到morefalse:
    • N的低7位,记为byte
    • N右移7位。
    • 如果N不为0,说明还有更高位的字节,将byte的最高位设为1。
    • 否则,将more标志设为false,表示已经处理完最后一个字节。
    • byte添加到resultvector中。
  5. 遍历resultvector,输出每个字节的十六进制表示:
    • 如果不是第一个字节,在前面添加一个空格。
    • 使用hexuppercasesetw(2)setfill('0')控制输出格式,以十六进制格式输出字节,使用大写字母,宽度为2,不足的在前面补0。
  6. 输出换行符。
  7. main函数中,读入无符号64位整数N,调用encodeVarint函数对N进行变长编码。

这个解答按照你提供的代码实现了变长编码,使用了C++标准库中的vector、iomanip等功能,并通过位运算和移位操作对整数进行处理。

解析2

#include <iostream>
#include <vector>
#include <iomanip>
#include <sstream>using namespace std;string encodeVarint(uint64_t N) {vector<uint8_t> result;bool more = true;while (more) {uint8_t byte = N & 0x7F; // 取低7位N >>= 7;if (N != 0) {byte |= 0x80; // 不是最后一个字节,最高位填1} else {more = false; // 最后一个字节,最高位填0}result.push_back(byte);}stringstream ss;for (size_t i = 0; i < result.size(); ++i) {if (i > 0) {ss << " ";}ss << hex << uppercase << setw(2) << setfill('0') << (int)result[i];}return ss.str();
}int main() {uint64_t N;cin >> N;string encodedString = encodeVarint(N);cout << encodedString << endl;return 0;
}

解析3

#include <bits/stdc++.h>
using namespace std;long long n;
string a = "0123456789ABCDEF"; // 十六进制的数字void print(int i) { // 输出cout << a[i / 16] << a[i % 16] << " ";
}int main() {cin >> n;if (n == 0) {cout << "00";return 0;}vector<int> result;while (n > 0) {int k = n % 128; // 2^7=128,7位一截n /= 128;if (n > 0) {result.push_back(k + 128); // 判断是否为最高位} else {result.push_back(k);}}reverse(result.begin(), result.end()); // 逆序输出for (int byte : result) {print(byte);}return 0;
}

相关文章:

B3870 [GESP202309 四级] 变长编码

[GESP202309 四级] 变长编码 题目描述 小明刚刚学习了三种整数编码方式&#xff1a;原码、反码、补码&#xff0c;并了解到计算机存储整数通常使用补码。但他总是觉得&#xff0c;生活中很少用到 2 31 − 1 2^{31}-1 231−1 这么大的数&#xff0c;生活中常用的 0 ∼ 100 0…...

WordPress网站更换域名后如何重新激活elementor

在创建WordPress网站时&#xff0c;我们常常需要更改域名。但是&#xff0c;在更换域名后&#xff0c;你可能会遇到一个问题&#xff1a;WordPress后台中的Elementor插件授权状态会显示为不匹配。这时&#xff0c;就需要重新激活Elementor插件的授权。下面我会详细说明如何操作…...

linux cron 执行url

linux cron 执行url 在Linux中&#xff0c;你可以使用curl或wget来执行URL。如果你想要定期执行这个操作&#xff0c;可以使用cron来设置定时任务。 以下是一个使用curl在cron中执行URL的例子&#xff1a; 打开终端。 输入 crontab -e 命令来编辑你的cron作业。 添加一个新…...

压缩视频在线压缩网站,压缩视频在线压缩工具软件

在数字化时代&#xff0c;视频成为了人们记录和分享生活的重要载体。然而&#xff0c;视频文件一般都非常大&#xff0c;这不仅占据了大量的存储空间&#xff0c;也给视频的传输和分享带来了不便。因此&#xff0c;压缩视频成为了许多人必须掌握的技能。本文将详细介绍如何压缩…...

linux经典例题编程

编写Shell脚本&#xff0c;计算1~100的和 首先vi 1.sh,创建一个名为1.sh的脚本&#xff0c;然后赋予这个脚本权限&#xff0c;使用命令chmod 755 1.sh&#xff0c;然后就可以在脚本中写程序&#xff0c;然后运行。 shell脚本内容 运行结果&#xff1a; 编写Shell脚本&#xf…...

二叉树的实现(初阶数据结构)

1.二叉树的概念及结构 1.1 概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合&#xff1a; 1.或者为空 2.由一个根结点加上两棵别称为左子树和右子树的二叉树组成 从上图可以看出&#xff1a; 1.二叉树不存在度大于2的结点 2.二叉树的子树有左右之分&#xff0c;次序不能…...

C++笔试强训day41

目录 1.棋子翻转 2.宵暗的妖怪 3.过桥 1.棋子翻转 链接https://www.nowcoder.com/practice/a8c89dc768c84ec29cbf9ca065e3f6b4?tpId128&tqId33769&ru/exam/oj &#xff08;简单题&#xff09;对题意进行简单模拟即可&#xff1a; class Solution { public:int dx[…...

【JavaScript】内置对象 - 字符串对象 ⑤ ( 判断对象中是否有某个属性 | 统计字符串中每个字符出现的次数 )

文章目录 一、判断对象中是否有某个属性1、获取对象属性2、判定对象是否有某个属性 二、统计字符串中每个字符出现的次数1、算法分析2、代码示例 String 字符串对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String 一、判…...

Linux环境下测试服务器的DDR5内存性能

要在Linux环境下测试服务器的DDR5内存性能&#xff0c;可以采用以下几种方法和工具&#xff1a; ### 测试原理 内存性能测试主要关注以下几个关键指标&#xff1a; - **带宽**&#xff1a;内存每秒能传输的数据量。 - **延迟**&#xff1a;内存访问请求从发出到完成所需的时间…...

19、matlab信号预处理中的中值滤波(medfilt1()函数)和萨维茨基-戈雷滤波滤(sgolayfilt()函数)

1、中值滤波&#xff1a;medfilt1()函数 说明&#xff1a;一维中值滤波 1&#xff09;语法 语法1&#xff1a;y medfilt1(x) 将输入向量x应用3阶一维中值滤波器。 语法2&#xff1a;y medfilt1(x,n) 将一个n阶一维中值滤波器应用于x。 语法3&#xff1a;y medfilt1(x,n…...

Scala 练习一 将Mysql表数据导入HBase

Scala 练习一 将Mysql表数据导入HBase 续第一篇&#xff1a;Java代码将Mysql表数据导入HBase表 源码仓库地址&#xff1a;https://gitee.com/leaf-domain/data-to-hbase 一、整体介绍二、依赖三、测试结果四、源码 一、整体介绍 HBase特质 连接HBase, 创建HBase执行对象 初始化…...

前端工程化:基于Vue.js 3.0的设计与实践

这里写目录标题 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》书籍引言本书概述主要内容作者简介为什么选择这本书&#xff1f;结语 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》书籍 够买连接—>https://item.jd.com/13952512.html 引言 在前端技术日…...

Linux☞进程控制

在终端执行命令时&#xff0c;Linux会建立进程&#xff0c;程序执行完&#xff0c;进程会被终止&#xff1b;Linux是一个多任务的OS,允许多个进程并发运行&#xff1b; Linxu中启动进程的两种途径&#xff1a; ①手动启动(前台进程(命令gedit)...后台进程(命令‘&’)) ②…...

mybatis离谱bug乱转类型

字符串传入的参数被转成了int&#xff1a; Param("online") String online<if test"online 0">and (heart_time is null or heart_time <![CDATA[ < ]]> UNIX_TIMESTAMP(SUBDATE(now(),INTERVAL 8 MINUTE)) )</if><if test"…...

视频监控管理平台LntonCVS视频汇聚平台充电桩视频监控应用方案

随着新能源汽车的广泛使用&#xff0c;公众对充电设施的安全性和可靠性日益重视。为了提高充电桩的安全管理和站点运营效率&#xff0c;LntonCVS公司推出了一套全面的新能源汽车充电桩视频监控与管理解决方案。 该方案通过安装高分辨率摄像头&#xff0c;对充电桩及其周边区域进…...

VS环境Python:深度探索与实用指南

VS环境Python&#xff1a;深度探索与实用指南 在编程领域&#xff0c;VS环境&#xff08;Visual Studio环境&#xff09;与Python的结合&#xff0c;为开发者们提供了一种强大而灵活的开发体验。这种结合不仅提升了开发效率&#xff0c;还增强了代码的可读性和可维护性。然而&…...

SpringBoot整合SpringSecurit(二)通过token进行访问

在文章&#xff1a;SpringBoot整合SpringSecurit&#xff08;一&#xff09;实现ajax的登录、退出、权限校验-CSDN博客 里面&#xff0c;使用的session的方式进行保存用户信息的&#xff0c;这一篇文章就是使用token的方式。 在其上进行的改造&#xff0c;可以先看SpringBoot…...

【算法训练 day50 打家劫舍、打家劫舍Ⅱ、打家劫舍Ⅲ】

目录 一、打家劫舍-LeetCode 198思路 二、打家劫舍Ⅱ-LeetCode 213思路 三.打家劫舍Ⅲ-LeeCode 337思路 一、打家劫舍-LeetCode 198 Leecode链接: leetcode 198 思路 dp数组含义为&#xff1a;当前数组范围下能偷到的最多的钱。递推公式为:dp[j] max(dp[j-2]nums[j],dp[j-1…...

YOLOv8改进 | 卷积模块 | 在主干网络中添加/替换蛇形卷积Dynamic Snake Convolution

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 蛇形动态卷积是一种新型的卷积操作&#xff0c;旨在提高对细长和弯曲的管状结构的特征提取能力。它通过自适应地调整卷积核的权重&#xff0…...

深入解析力扣183题:从不订购的客户(LEFT JOIN与子查询方法详解)

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 在本篇文章中&#xff0c;我们将详细解读力扣第183题“从不订购的客户”。通过学习本篇文章&#xff0c;读者将掌握如何使用SQL语句来解决这一问题&#xff0c;并了解相关的复杂…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...