c#int[]数组到byte[]数组仅限LSB

c#int[]数组到byte[]数组仅限LSB,c#,arrays,algorithm,type-conversion,C#,Arrays,Algorithm,Type Conversion,将int[]数组写入byte[]数组的最快方法是什么,但只写入LSB(最后8位)?我将用于循环和位掩码bArray[I]=(字节)(iArray[I]&0xFF),但数组非常长(+900k),这大约需要50ms。您知道其他更快的选择吗?您可以尝试并行化工作负载: Parallel.For(0,iArray.Length, i => bArray[i] = (byte)(iArray[i] & 0xFF)); 这将产生多个线程来进行转换。在我的机器上它往往更快,但是,由于产生多个线

将int[]数组写入byte[]数组的最快方法是什么,但只写入LSB(最后8位)?我将
用于
循环和位掩码
bArray[I]=(字节)(iArray[I]&0xFF)
,但数组非常长(+900k),这大约需要50ms。您知道其他更快的选择吗?

您可以尝试并行化工作负载:

Parallel.For(0,iArray.Length, i => bArray[i] = (byte)(iArray[i] & 0xFF));
这将产生多个线程来进行转换。在我的机器上它往往更快,但是,由于产生多个线程的开销,有时需要更长的时间


50ms太慢了,你在做什么?

部分慢是因为需要读取比需要更多的数据:当你这样做的时候

array[i] & 0xFF
您读取了一个
int
的全部四个字节,但只删除了三个最重要的字节

您可以使用不安全的代码来避免这种开销。请记住,以下方法采用的是little endian体系结构:

static unsafe void CopyLsbUnsafe(int[] from, byte[] to) {
    fixed (int* s = from) {
        fixed (byte* d = to) {
            byte* sb = (byte*) s;
            int* db = (int*)d;
            int* end = db + to.Length/4;
            while (db != end) {
                *db++ = (*(sb + 0) << 0)
                      | (*(sb + 4) << 8)
                      | (*(sb + 8) << 16)
                      | (*(sb + 12) << 24);
                sb += 16;
            }
        }
    }
}
静态不安全void CopyLsbUnsafe(int[]from,byte[]to){
固定(int*s=from){
固定(字节*d=to){
字节*sb=(字节*)s;
int*db=(int*)d;
int*end=db+to.Length/4;
while(db!=结束){

*db++=(*(sb+0)你是说你想把int数组中每个int的LSB放到byte数组中吗?你需要以50毫秒的速度处理将近100万个项目…你有没有想过要并行到一个GPU?除此之外,我认为你可能会遇到CPU限制here@bpgeck是,整数数组到字节数组中每个整数的LSB。即,16位I的200个LSB值nt数组到200个值的8位字节数组。@drew_w我知道这是非常大的数据量,但我想知道C#中最快的选项。根据下面的注释,如果您正在处理图像数据,最好的选项是使用诸如BitBlt和MemCpy()之类的低级操作系统指令。这些可以通过PInvoke调用,并应提供最佳性能。希望这会有所帮助!我想显示图像阵列,但我的函数只需要字节作为参数-256灰度就足够了,并且比16位快。