将 int 转换为数组的最佳方法
Best approach for converting int into array
我的代码中有以下变量
uint8_t array[8];
uint64_t epoch;
我需要将纪元变量复制到数组中(纪元的 msb 应该进入数组 [0])。
我通过单独复制每个字节来完成这个逻辑
array[0] = epoch>>56;
array[1] = epoch>>48;
.
.
array[7] = epoch;
还有什么选择??
像这样的东西应该是字节序无关的:
const size_t SIZE64 = sizeof(uint64_t);
for(size_t i=0; i<SIZE64; i++)
{
uint8_t bits = 8 * (SIZE64-i-1); // 8 bits * (8 bytes - byte index)
array[i] = epoch >> bits;
}
您可以执行以下操作:
for (int i=0, shift=56; i<8; i++, shift-=8)
array[i] = epoch >> shift;
这基本上是:
array[0] = epoch>>56; // first iteration (shift = 56)
array[1] = epoch>>48;
..
..
array[7] = epoch>>0; // last iteration (shift = 56 - 7 * 8 = 0)
请注意,>>
运算符总是将位移向最低有效位,因此体系结构的尾数对于这段代码无关紧要。
我认为这更有效,因为它移动了固定数量的位数:
uint8_t i=8;
uint64_t e=epoch;
while(i){
array[--i]=e;
e>>=8;
}
我的代码中有以下变量
uint8_t array[8];
uint64_t epoch;
我需要将纪元变量复制到数组中(纪元的 msb 应该进入数组 [0])。 我通过单独复制每个字节来完成这个逻辑
array[0] = epoch>>56;
array[1] = epoch>>48;
.
.
array[7] = epoch;
还有什么选择??
像这样的东西应该是字节序无关的:
const size_t SIZE64 = sizeof(uint64_t);
for(size_t i=0; i<SIZE64; i++)
{
uint8_t bits = 8 * (SIZE64-i-1); // 8 bits * (8 bytes - byte index)
array[i] = epoch >> bits;
}
您可以执行以下操作:
for (int i=0, shift=56; i<8; i++, shift-=8)
array[i] = epoch >> shift;
这基本上是:
array[0] = epoch>>56; // first iteration (shift = 56)
array[1] = epoch>>48;
..
..
array[7] = epoch>>0; // last iteration (shift = 56 - 7 * 8 = 0)
请注意,>>
运算符总是将位移向最低有效位,因此体系结构的尾数对于这段代码无关紧要。
我认为这更有效,因为它移动了固定数量的位数:
uint8_t i=8;
uint64_t e=epoch;
while(i){
array[--i]=e;
e>>=8;
}