【发布时间】:2020-04-07 03:58:14
【问题描述】:
所以我有一个 8 字节的数组,我无法控制,也无法直接更改其格式。此代码是与硬件进行通信的瓶颈,因此优化它很重要。
我的任务是从 8 个源字节中的每个字节中提取 1 个字节的有用数据。我需要从字节中提取的每一位始终处于相同的偏移量。我从最高有效位到最低有效位构建结果字节。
我现在的解决方案如下
const uint8_t MASK = 0x04;
void extract(uint8_t* data, uint8_t* result) {
// I assume result starts equal to 0
uint8_t j = 0x80; // Most significant bit first
for (uint8_t i = 0; i < 8; ++i) {
// Check if the bit I am interested in is high
if (data[i] & MASK) {
// Set the bit in result high
*result |= j;
}
// Move on to the next bit
j >>= 1;
}
}
我觉得这已接近最佳状态,但我不擅长使用位魔法,所以我很好奇是否有人知道更快的方法。
代码在 AM335X 上的 TI-PRU 上运行
【问题讨论】:
-
您的意思是
*result |= j;?一种不使用条件的方法是使用res16 |= (data[i] & mask); res16 <<= 1;构建一个 16 位值,并在末尾对齐res16。 -
通过测量进行优化,这意味着确定最快方法的唯一可靠方法是实施您能想到的所有方法并测量哪种方法最快。如果不进行衡量,试图加速优化是徒劳的。
-
这也取决于微观,有些具有多位移位,例如 x86,有些则没有。
-
你的代码是not compile,我想这是一个错字。
-
AM335X 是 300MHz ARM Cortex-A8,你认为它“非常有限”?我梦想有这样的马力!更加量化 - 它需要多快(例如每秒比特数)?因为这似乎不太可能成为大多数沟通渠道的瓶颈。
标签: c optimization embedded bit-manipulation bit-shift