我有一个10位强度值的UInt16[1000,1000]
数组,我希望从0-9位上移6位到6-15位。什么是快速的方法呢?只需循环遍历i = i << 6
的所有元素就太慢了。
答案 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)
通过使用多个线程,您使用的任何解决方案都可以加快速度。只是不要锁定同一个对象,以某种方式将数据分开。