Байты без знака, и все они меньше 16, поэтому их можно поместить в откусывание. В настоящее время я перемещаю байты в цикле и &
их с помощью 0xf
:
pub fn compress(offsets: [u8; 8]) -> u32 {
let mut co: u32 = 0;
for (i, o) in offsets.iter().enumerate() {
co |= ((*o as u32) & 0xf ) << (i * 4);
}
co
}
Компилятор уже сделал хорошую оптимизацию:
Но, может быть, можно немного покрутить или использовать SIMD-команды с u64
, чтобы уменьшить количество операций?
pext
- это 3-тактная инструкция на Intel, по сути непревзойденная, пока не появится более специализированная инструкция. А вот на AMD плохо. Это также опровергает существование самого быстрого способа сделать это: относительные скорости различных подходов зависят от аппаратного обеспечения. Так что, если мы буквально воспримем название ОП, ответа нет. 10.12.2019pext
быстрее, чем независимая от архитектуры версия, есть ли дополнительная информация о том, как она реализована? К сожалению, у меня нет процессора AMD для этого. 11.12.2019