我正在执行以下代码以从数组中读出特定值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;
注意:代码工作正常。这只是样式的问题。
答案 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);