如何快速将10位强度转换为16位像素?

时间:2011-10-16 22:53:27

标签: c# .net

我有一个10位强度值的UInt16[1000,1000]数组,我希望从0-9位上移6位到6-15位。什么是快速的方法呢?只需循环遍历i = i << 6的所有元素就太慢了。

2 个答案:

答案 0 :(得分:2)

如果使用指针直接访问,则使用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位整数会更快。

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

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

答案 1 :(得分:0)

通过使用多个线程,您使用的任何解决方案都可以加快速度。只是不要锁定同一个对象,以某种方式将数据分开。