如何快速将10位强度转移到16位像素的顶部

本文关键字:16位 像素 顶部 转移 何快速 10位 | 更新日期: 2023-09-27 18:11:38

我有一个10位强度值的UInt16[1000,1000]数组,我想从0-9位向上移动6位到6-15位。有什么快速的方法?简单地循环所有执行i = i << 6的元素太慢了。

如何快速将10位强度转移到16位像素的顶部

如果使用指针直接访问,则使用32位或64位整数并对其进行移位。应该会得到相同的结果,但我希望它能快一些(2倍左右)。另一个加速应该来自于避免访问2D数组时的复杂索引逻辑。

像这样:

fixed(UInt16* p0=&arr)
{
    UInt32* p=(UInt32*)p0;
    UInt32* p_end=p+1000*1000/(sizeof(UInt32)/sizeof(UInt16));
    while(p!=p_end)
    {
        *p = *p << 6;
    }
}

我假设在32位进程中32位整型更快,而在64位进程中64位整型更快。

你可能想要进行一些手动循环展开,即在循环的一次迭代中放入多个赋值。

可能还需要特别注意数组的末尾。如果数组的大小不是所选整数大小的倍数。

无论您使用什么解决方案,都可以通过使用多个线程来加快速度。只是不要锁定相同的对象,保持数据的分离。