我的代码中有以下变量
uint8_t array[8];
uint64_t epoch;
我需要将epoch变量复制到数组中(epoch的msb应该进入array [0])。 我通过单独复制每个字节来实现这个逻辑
array[0] = epoch>>56;
array[1] = epoch>>48;
.
.
array[7] = epoch;
另一种选择是什么?
答案 0 :(得分:1)
这样的事情应该是与字节无关的:
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;
}
答案 1 :(得分:0)
您可以执行以下操作:
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)
请注意,>>
运算符始终将位移向最低有效位,因此架构的endinannes对于这段代码无关紧要。
答案 2 :(得分:-2)
我认为这更有效,因为它会移动固定的位数:
uint8_t i=8;
uint64_t e=epoch;
while(i){
array[--i]=e;
e>>=8;
}