B3870 [GESP202309 四級] 變長編碼

[GESP202309 四級] 變長編碼

題目描述

小明剛剛學習了三種整數編碼方式:原碼、反碼、補碼,并了解到計算機存儲整數通常使用補碼。但他總是覺得,生活中很少用到 2 31 ? 1 2^{31}-1 231?1 這么大的數,生活中常用的 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;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24520.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24520.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24520.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring進階技巧:利用AOP提前介入的巧妙實踐

Spring框架中的面向切面編程&#xff08;AOP&#xff09;是一種強大的機制&#xff0c;它允許開發者在不修改原有代碼的情況下&#xff0c;對程序進行橫向切面的功能擴展。AOP提供了一種方式&#xff0c;可以在目標Bean的生命周期早期階段就實施切面邏輯&#xff0c;這為我們在…

Python 中如何使用 lambda 函數

在 Python 中&#xff0c;可以使用 lambda 函數來創建匿名函數。lambda 函數的語法是&#xff1a;lambda 參數: 表達式。以下是一些使用 lambda 函數的例子&#xff1a; 通過 lambda 函數來計算兩個數的和&#xff1a; add lambda x, y: x y print(add(2, 3)) # 輸出 5通過…

Oracle 日志挖掘

oracle 11g 日志挖掘測試 需要開啟補充日志 alter database add supplemental log data; SELECT SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;在用戶下執行一些刪除&#xff0c;插入等操作 SQL> create table zxy( …

LLM評測數據集

1. C-Eval 數據集源地址: C-Eval Official Repository 數據范圍: 該數據集包括學科類知識測試&#xff0c;涵蓋廣泛的學科知識&#xff0c;例如數學、物理、化學等。 數據集大小及數據形式: 數據集包含13,948道單選題&#xff0c;題目均為中文。 論文地址: C-Eval: A Multi-…

【一百一十】【算法分析與設計】[SDOI2009] HH的項鏈,樹狀數組應用,查詢區間的種類數,樹狀數組查詢區間種類數

P1972 [SDOI2009] HH的項鏈 [SDOI2009] HH的項鏈 題目描述 HH 有一串由各種漂亮的貝殼組成的項鏈。HH 相信不同的貝殼會帶來好運&#xff0c;所以每次散步完后&#xff0c;他都會隨意取出一段貝殼&#xff0c;思考它們所表達的含義。HH 不斷地收集新的貝殼&#xff0c;因此&am…

SMS - 基于阿里云實現手機短信驗證碼登錄(無需備案,非測試)

目錄 SMS 環境調試 從阿里云云市場中購買第三方短信服務 調試短信驗證碼功能 實戰開發 封裝組件 對外接口 調用演示 SMS 環境調試 從阿里云云市場中購買第三方短信服務 a&#xff09;進入阿里云首頁&#xff0c;然后從云市場中找到 “短信” &#xff08;一定要從 云…

如何實現網站HTTPS訪問

在當今網絡安全至關重要的時代&#xff0c;HTTPS已經成為網站安全的基本標準。HTTPS&#xff08;超文本傳輸安全協議&#xff09;通過在HTTP協議基礎上加入SSL加密層&#xff0c;確保了數據在用戶瀏覽器和服務器之間的傳輸是加密的&#xff0c;有效防止數據被竊取或篡改&#x…

calico node一直not ready

背景 我司某個大數據集群在做完添加到集群聯邦管理后&#xff0c;該集群的calico-node全部處于not ready 狀態&#xff0c;導致集群中節點之前的跨節點容器網絡不通。 操作 將大數據所在的k8s集群添加到集群聯邦的控制平面后&#xff0c;我們為了做各個子集群之間的容器網絡…

換熱器設計參數的選用

1 換熱管類型 光管&#xff1a;適用于任何條件&#xff1b;應用面廣 螺紋管&#xff1a;殼程流體的膜傳熱系數相當于管程傳熱系數1/3~3/5的場合&#xff1b;強化殼程傳熱系數&#xff0c;提高總傳熱系數&#xff1b;結垢速率低&#xff0c;結垢周期長。 波紋管&#xff1a;管…

使用 PAI-DSW x Free Prompt Editing圖像編輯算法,開發個人AIGC繪圖小助理

教程簡述 在本教程中&#xff0c;您將學習在阿里云交互式建模平臺PAI-DSW x Free Prompt Editing&#xff08;CVPR2024中選論文算法&#xff09;圖像編輯算法&#xff0c;開發個人AIGC繪圖小助理&#xff0c;實現文本驅動的圖像編輯功能單卡即可完成AIGC圖片風格變化、背景變化…

Java 的分支

分支控制有三種&#xff1a;單分支&#xff0c;雙分支&#xff0c;多分支。 單分支 基本語法&#xff1a; if (條件表達式){執行代碼塊; }程序示例&#xff1a; import java.util.Scanner;public class If01 {public static void main(String[] args) {Scanner sc new Sca…

【JAVA WEB實用技巧與優化方案】如何通過javacore、heapdump來排查JVM線程和內存問題

文章目錄 介紹什么是javacore ? javacore可以用來做哪些分析?什么是HeapDump?一、輸出JAVACORE 和 DUMP文件1.輸出JAVACORE通過`kill -3 [pid]` 來輸出javacore通過jstack 輸出Javacore文件2.輸出 dump 文件二、javacore文件和heapdump文件的分析工具使用詳情javacore 工具i…

Cesium開發環境搭建(一)

1.下載安裝Node.js 進入官網地址下載安裝包 Node.js — Download Node.js https://cdn.npmmirror.com/binaries/node/ 選擇對應你系統的Node.js版本&#xff0c;這里我選擇的是Windows系統、64位 安裝完成后&#xff0c;WINR&#xff0c;輸入node --version&#xff0c;顯示…

React + SpringBoot實現圖片預覽和視頻在線播放,其中視頻實現切片保存和分段播放

圖片預覽和視頻在線播放 需求描述 實現播放視頻的需求時&#xff0c;往往是前端直接加載一個mp4文件&#xff0c;這樣做法在遇到視頻文件較大時&#xff0c;容易造成卡頓&#xff0c;不能及時加載出來。我們可以將視頻進行切片&#xff0c;然后分段加載。播放一點加載一點&am…

tcp aimd 窗口的推導

舊事重提&#xff0c;今天用微分方程的數值解觀測 tcp aimd 窗口值。 設系統 AI&#xff0c;MD 參數分別為 a 1&#xff0c;b 0.5&#xff0c;丟包率由 buffer 大小&#xff0c;red 配置以及線路誤碼率共同決定&#xff0c;設為 p&#xff0c;窗口為 W&#xff0c;則有&…

云原生技術助力某國際化商業集團打造數字化轉型新引擎

某國際化商業集團&#xff08;以下簡稱&#xff1a;集團&#xff09;&#xff0c;成立于1988年&#xff0c;現已發展成為擁有總資產800多億元&#xff0c;員工13000多人&#xff0c;涵蓋港口碼頭、石油化工、國際貿易等產業于一體的國際化現代化企業集團&#xff0c;連續多年進…

HAL STM32F1 通過查表方式實現SVPWM驅動無刷電機測試

HAL STM32F1 通過查表方式實現SVPWM驅動無刷電機測試 &#x1f4cd;相關篇《基于開源項目HAL STM32F4 DSP庫跑SVPWM開環速度測試》 ?針對STM32F1系列&#xff0c;沒有專門的可依賴的DSP庫&#xff0c;為了實現特定函數的浮點運算快速計算&#xff0c;通過查表方式來實現&#…

番外篇 | 利用華為2023最新Gold-YOLO中的Gatherand-Distribute對特征融合模塊進行改進

前言:Hello大家好,我是小哥談。論文提出一種改進的信息融合機制Gather-and-Distribute (GD) ,通過全局融合多層特征并將全局信息注入高層,以提高YOLO系列模型的信息融合能力和檢測性能。通過引入MAE-style預訓練方法,進一步提高模型的準確性。?? 目錄 ??1.論文解…

如何解鎖植物大戰僵尸雜交版v2.0.88所有植物

如何解鎖植物大戰僵尸雜交版v2.0.88所有植物 前言安裝相關軟件快速解鎖方法 前言 經過探索植物大戰僵尸雜交版植物解鎖和關卡有關&#xff0c;所以通過所有關卡就可以解鎖所有植物。 安裝相關軟件 1.安裝植物大戰僵尸 2.安裝Hex Editor Neo 快速解鎖方法 本文參考如何修改…

<vs2022><問題記錄>visual studio 2022使用console打印輸出時,輸出窗口不顯示內容

前言 本文為問題記錄。 問題概述 在使用visual studio 2022編寫代碼時&#xff0c;如C#&#xff0c;在代碼中使用console.writeline來打印某些內容&#xff0c;以便于觀察&#xff0c;但發現輸出窗口不顯示&#xff0c;而代碼是完全沒有問題的。 解決辦法 根據網上提供的辦法…