我有1-10个号码。在C ++中,是否可以在一个字节中存储两个以上的数据?
我相信可以存储至少2:char是0-255。这意味着我们可以存储0-9的数字和10-100的数字。
a)是否可以通过某种位操作来存储2个以上的数据?
b)最快的方法是什么?
答案 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个值。
您的号码的最紧凑/压缩存储格式是:
例如,“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