gpt4 book ai didi

character-encoding - 使用一个字节表示 3 个整数?

转载 作者:行者123 更新时间:2023-12-03 23:41:21 25 4
gpt4 key购买 nike

我有三个整数 { a , b , c在以下值之间的范围(比如说):
a - {1 到 120,跳跃 1}
b - {-100 到 100,跳跃 5}
c - {1 到 10,跳跃 1}

由于空间考虑,我想仅使用 1 个字节来表示这三个值,这意味着单个整数(在 -127..128 范围内)将表示 { a 的结果, b , c并以二进制格式存储到磁盘。

稍后,当我读取二进制数据时,我将知道如何“解析”这 1 个字节以获取 { a 的值。 , b , c }.

知道如何实现这一目标吗? (注意:如果需要,为了支持这种设计,我可以在范围上“妥协”;例如,例如,a 可以是 5 的跳跃。b 也可以是 10 的跳跃等)

最佳答案

仅从数字的角度来看,我们有:

a = 120 个值,b = 41 个值,c = 10 个值

这总共有 49,200 个唯一值。一个字节只能表示 256 个值,因此您至少需要使用 16 位(两个字节)来表示您的范围。

一种方法是通过位移位。

例如,您可以将四个 8 位值存储在一个 32 位值中,并像这样提取它们:

#include <iostream>
using namespace std;


int pack32(char *v)
{
return (v[0] << 24) + (v[1] << 16) + (v[2] << 8) + v[3];
}

void unpack32(int a, char *v)
{
v[0] = a >> 24;
v[1] = a >> 16;
v[2] = a >> 8;
v[3] = a;
}

int main()
{
char v[4] = {32, 64, 16, 8};

cout << "Original values: ";
for (int i = 0; i < 4 ; i++)
cout << (int)v[i] << " ";
cout << endl;

int q = pack32(v);
cout << "Packed: " << q << endl;

unpack32(q, v);
cout << "Unpacked: ";
for (int i = 0; i < 4; i++)
cout << (int)v[i] << " ";

return 0;
}

与您的需求相关的代码:
unsigned short pack32(unsigned a, char b, unsigned c)
{
// Layout:
// Bits 0 - 5 are reserved for a
// Bits 6 - 12 are reserved for b
// Bits 13 - 15 are reserved for c

// Assumptions:
// a is [2, 120] in steps of 2
// b is [-100, 100] in steps of 5
// c is [1, 10] in steps of 1

// Shift a from [2, 120] to [0, 59]
unsigned a2 = (a - 2) >> 1;
// Shift b from [-100, 100] to [0, 40]
unsigned b2 = b / 5 + 20;
// Shift c from [1, 10] to [0, 9]
unsigned c2 = c - 1;

return a2 + (b2 << 5) + (c2 << 12);
}

关于character-encoding - 使用一个字节表示 3 个整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5301765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com