在C中有效地实现三元数据类型的数组

时间:2015-08-24 14:49:11

标签: c arrays ternary

我需要在C中实现三元数据类型的“大”数组(~1800个元素)尽可能高效地进行加密研究。我想到了以下几点:

使用任意大小的整数数组,使用2位代表每个元素

所以我有

typedef uint32_t block;
const int blocksize = sizeof(block)<<3;

block dataArray[3]; // 3*32 bit => 48 Elements

uint8_t getElementAt(block *data, int position)
{
    position = position * 2;
    return (data[position/blocksize] >> (position % blocksize)) & 3;
}

给我0..2,我可以映射到我的三个值。

使用uint8_t数组直接处理elementy。

uint8_t data[48];

当然,这需要至少四倍的RAM,但寻址和设置可能更有效 - 是吗?

在两种解决方案中,是否还有其他任何可能的缺失或特殊警告?

1 个答案:

答案 0 :(得分:1)

答案取决于阵列的大小,以及您希望如何进行优化。我描绘了一些场景:

运行时,小数组。

只需使用unsigned long arr[N]即可。仅在机器字边界上读取是最快的,但是使用大量内存。当内存使用量过大时,您实际上不希望这样做,因为缓存性能超过了对齐的读取。

运行时,大数组。

使用unsigned char arr[N]。这将为您提供快速的读/写速度。

良好的内存使用率,平庸的速度。

使用unsigned long arr[N]并将每个trit存储为两位,使用shift和mask解压缩。

更好的内存使用,慢。

通过在base-3中存储数字,使用unsigned long arr[N]和存储楼层(CHAR_BIT * sizeof(long) * log(2) / log(3))号码。您可以使用此方法以32位打包20次。

最佳内存使用量,可怕。

使用bignum实现将所有数字存储为一个base-3数字中的数字。