我需要在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,但寻址和设置可能更有效 - 是吗?
在两种解决方案中,是否还有其他任何可能的缺失或特殊警告?
答案 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数字中的数字。