C#/。net通过短[]按位左移操作

有没有一种方法(在C#/。净),将左移(按位)每短在短[]会更快,然后在一个循环?

我正在谈论数码相机(16位灰色)的数据,相机只使用较低的12位。 因此,在呈现数据时要查看某些内容,需要将其左移4。

这是我迄今为止所做的:

byte[] RawData; // from camera along with the other info

if (pf == PixelFormats.Gray16)
{
    fixed (byte* ptr = RawData)
    {
        short* wptr = (short*)ptr;
        short temp;

        for (int line = 0; line < ImageHeight; line++)
        {
            for (int pix = 0; pix < ImageWidth; pix++)
            {
                temp = *(wptr + (pix + line * ImageWidth));
                *(wptr + (pix + line * ImageWidth)) = (short)(temp << 4);
            }
        }
    }
}

有任何想法吗?


我不知道可以做到的图书馆方法,但我有一些可能有所帮助的建议。 如果你知道像素的高四位肯定是零(而不是垃圾),这将仅适用。 (如果它们是垃圾,则必须在下面添加位掩码)。 基本上我会建议:

  • 在较大数据类型(int或long)上使用移位运算符,以便一次移动更多数据
  • 摆脱循环内部的乘法运算
  • 做一点循环展开
  • 这是我的代码:

    using System.Diagnostics;
    
    namespace ConsoleApplication9 {
      class Program {
        public static void Main() {
          Crazy();
        }
    
        private static unsafe void Crazy() {
          short[] RawData={
            0x000, 0x111, 0x222, 0x333, 0x444, 0x555, 0x666, 0x777, 0x888,
            0x999, 0xaaa, 0xbbb, 0xccc, 0xddd, 0xeee, 0xfff, 0x123, 0x456,
    
            //extra sentinel value which is just here to demonstrate that the algorithm
            //doesn't go too far
            0xbad 
          };
    
          const int ImageHeight=2;
          const int ImageWidth=9;
    
          var numShorts=ImageHeight*ImageWidth;
    
          fixed(short* rawDataAsShortPtr=RawData) {
            var nextLong=(long*)rawDataAsShortPtr;
    
            //1 chunk of 4 longs
            // ==8 ints
            // ==16 shorts
            while(numShorts>=16) {
              *nextLong=*nextLong<<4;
              nextLong++;
              *nextLong=*nextLong<<4;
              nextLong++;
              *nextLong=*nextLong<<4;
              nextLong++;
              *nextLong=*nextLong<<4;
              nextLong++;
    
              numShorts-=16;
            }
    
            var nextShort=(short*)nextLong;
            while(numShorts>0) {
              *nextShort=(short)(*nextShort<<4);
              nextShort++;
              numShorts--;
            }
          }
    
          foreach(var item in RawData) {
            Debug.Print("{0:X4}", item);
          }
        }
      }
    }
    
    链接地址: http://www.djcxy.com/p/72499.html

    上一篇: C#/.net bitwise shift left operation over a short[]

    下一篇: When are bitwise operations appropriate