一个字节可以存储多少1-10个数字?

时间:2014-01-09 15:04:37

标签: arrays

我有1-10个号码。在C ++中,是否可以在一个字节中存储两个以上的数据?

我相信可以存储至少2:char是0-255。这意味着我们可以存储0-9的数字和10-100的数字。

a)是否可以通过某种位操作来存储2个以上的数据?

b)最快的方法是什么?

3 个答案:

答案 0 :(得分:4)

从1到10有10个可能的数字(很明显,我知道,但必须说)。从10个可能值中进行选择需要log(10)/ log(2)〜= 3.32位进行编码。这意味着你能以8位存储的最多是两个这样的选择。

但是如果你有大量的,那么每个字节可以存储多于两个。例如,在32位中,您可以存储从1到10(需要29.9位)的9个数字,即每字节2.25。

答案 1 :(得分:3)

我想你是否可以存储3个十进制数字,例如“7和5和8”。

如果是,那么答案是,否:因为要存储3个独立的数字,您需要存储1000个值中的任何一个。一个字节只能存储256个值。

您的号码的最紧凑/压缩存储格式是:

  • 从每个数字中减去1,将其从“1到10”转换为十进制数字“0到9”
  • 合并小数位并将它们存储为普通(无符号)二进制数

例如,“8和6和9” - > “7和5和8” - > “758” - > 0x256 - > 1001010110

答案 2 :(得分:2)

首先,如果内存不是问题,请避免使用它。使用signed或unsigned char来存储单个值。

如果要节省内存(如通过网络传输数据阵列或保存文件大小),可以使用位运算符操作一个字节的单个位。例如,让我们从0到15获取值 - 它适合4位。然后

// values from 0 ot 15
unsigned char v1 = 1, v2 = 15;
// pack two values into one byte
unsigned char elem = (v1 << 4) + v2; // shift v1 to left and add v2

// unpack values
v1 = elem >> 4; // shift to right
v2 = elem & 0x0F; // clear higher 4 bits

// of course, you are going to use an array of elems