更优雅的方式从内存中读取6个字节

时间:2013-08-30 04:29:21

标签: c arrays pointers

我正在执行以下代码以从数组中读出特定值6字节。对于我来说,以下看起来很难看。我在Little Endian处理器上运行此代码。 有什么方法可以让它更优雅。

temp_ts = (ptr[ts_offset]);
new_ts = temp_ts << 40;

temp_ts = (ptr[ts_offset + 1]);
new_ts |= temp_ts << 32;

temp_ts = (ptr[ts_offset + 2]);
new_ts |= temp_ts << 24;

temp_ts = (ptr[ts_offset + 3]);
new_ts |= temp_ts << 16;

temp_ts = (ptr[ts_offset + 4]);
new_ts |= temp_ts << 8;

temp_ts = (ptr[ts_offset + 5]);
new_ts |= temp_ts << 0;

注意:代码工作正常。这只是样式的问题。

3 个答案:

答案 0 :(得分:3)

您可以将其编码为循环,让编译器进行展开:

for (new_ts = i = 0; i < 6; i++) 
  new_ts = (new_ts << 8) | ptr[ts_offset + i];

对于它的价值,我用gcc 4.3.6-O4编译了它。它很好地展开。

答案 1 :(得分:1)

尝试以下

int offset = 0;
int shift = 40;
while (offset <= 5) { 
  temp_ts = ptr[ts_offset + offset];
  new_ts |= temp_ts << shift;
  offset++;
  shift -= 8;
}

答案 2 :(得分:1)

我喜欢你多余的<< 0;再次对称,我还在+ 0添加了:

p = ptr;
o = ts_offset;
new_ts = (p[o + 0] << 40) | (p[o + 1] << 32) | (p[o + 2] << 24) |
         (p[o + 3] << 16) | (p[o + 4] <<  8) | (p[o + 5] <<  0);

或添加简化(其他人没看到):

unsigned char* p = ptr + ts_offset;
new_ts = (p[0] << 40) | (p[1] << 32) | (p[2] << 24) |
         (p[3] << 16) | (p[4] <<  8) | (p[5] <<  0);