递增unsigned char数组



我有一个接受unsigned char ctr[24]的程序。这将被使用很多次,我希望每次操作都有一个新的ctr。因此,我需要每次生成一个随机值,或者我可以将其初始化为0并自增。我追求的是性能,所以每次生成一个新值可能会比增量慢。是否有可能增加一个无符号字符数组?

0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01

等。

0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02

unsigned char ctr[24] = {0};视为初始化为0的计数器,则24个元素可视为UCHAR_MAX+1基数的数字。基于这个问题,"单位"数字要存储在ctr[23]中,基数1"ctr[22]中的数字,基数2;ctr[21]中的数字,等等。当值为UCHAR_MAX的数字加1时,它将变成0和一个进位位。1的值需要加到下一个数字的位置

void increment(unsigned char ctr[static 24])
{
unsigned int pos = 24;
while (pos-- && ++ctr[pos] == 0)
;
}

上面的函数增加了一个unsigned char[24]。它首先增加ctr[23],如果它已经被换行为0,则增加ctr[22],以此类推,直到其中一个数字没有被换行为0,或者所有的数字都被换行为0。

您几乎不可能真的需要....我的意思是,如果你只是采取了前8个字节,并将它们视为uint64_t,将运行很长,很长,时间之前包装。

在我看来,一些指针的类型的东西,这是工作完成的任何可能的用例。

请注意,您可能需要在24的中间使用一些字节来确保内存对齐适合64位访问,但这是微不足道的。

void *inc(void *buff, size_t size)
{
unsigned char *cbuff = buff;
for(size_t index = 0; index < size; index++)
{
if(cbuff[index] == 255)
{
cbuff[index] = 0;
}
else
{
cbuff[index]++;
break;
}
}
return buff;
}

我有一个接受无符号字符ctr[24]的程序。这将会被使用很多次,我希望每次操作都有一个新的ctr。因此,我需要每次生成一个随机值,或者我可以将其初始化为0并自增。我追求的是性能,所以每次生成一个新值可能会比增量慢。是否有可能增加一个无符号字符数组?

不要.

使用一个简单的unsigned long long。它足够大了。

At 3十亿每秒递增操作数,滚动一个64位的值需要97年。

unsigned long long已经足够大了。

像这样?未经考验的

void add1_recur(unsigned char *x, int lo) {
if (lo < 0) /* 192 bit overflow! */ exit(EXIT_FAILURE);
if (x[lo] == 255) {
x[lo] = 0;
add1_recur(x, lo - 1;)
} else {
x[lo] += 1;
}
}
// add 1 to x; assume x[0] is high order bit
void add1_inplace(unsigned char x[static 24]) {
add1_recur(x, 23);
}

据我所知,您每次只需要一个新的模式。不一定是计数器。

那么工会可以吗?

:

typedef union
{
uint64_t d64[3];
unsigned char d8[24];
} ctr_t;
void p(unsigned char ca[])
{
for (int i=0; i<24; ++i) printf("0x%02X ", ca[i]);
puts("");
}
void change(ctr_t* ctr)
{
// Do some change to each of the three uint64
++ctr->d64[0];
--ctr->d64[1];
++ctr->d64[2];
}
int main(void) {
ctr_t ctr = {{0, 0, 0xff00ff00ff}};  // Just some initialization
p(ctr.d8);
change(&ctr);
p(ctr.d8);
change(&ctr);
p(ctr.d8);
change(&ctr);
p(ctr.d8);
return 0;
}

0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x00 0xFF 0x00 0xFF 0x00 0x00 0x00 
0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00 0x01 0xFF 0x00 0xFF 0x00 0x00 0x00 
0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xFE 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x01 0x01 0xFF 0x00 0xFF 0x00 0x00 0x00 
0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xFD 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x02 0x01 0xFF 0x00 0xFF 0x00 0x00 0x00 

最新更新