C#-数组转置位电平

C#-数组转置位电平,c#,matrix,binary,transpose,C#,Matrix,Binary,Transpose,我有一个10x8位(字节)的数组,名为Matrix[10],例如 byte[] Matrix = new byte[] { 0b01111011, 0b10001100, 0b10101101, 0b10100001, 0b11010110, 0b00011100, 0b00111000, 0b11001111, 0b01111011, 0b10101010, }; 我要做的是创建另一个名为Matrix\u

我有一个10x8位(字节)的数组,名为
Matrix[10]
,例如

  byte[] Matrix = new byte[] {
    0b01111011,
    0b10001100,
    0b10101101,
    0b10100001,
    0b11010110,
    0b00011100,
    0b00111000,
    0b11001111,
    0b01111011,
    0b10101010,
  };
我要做的是创建另一个名为
Matrix\u res10
的数组,它将具有8 x 10位(使用
Int32
)元素:

  int[] Matrix_res10 = new int[] {
    0b0111100101,
    0b1000100110,
    0b1011001011,
    0b1000111010,
    0b1110011111,
    0b0110110100,
    0b1000100111,
    0b1011000110
  }; 
附加“说明”图片中的附加说明

现在,我能够做到这一点,但我觉得代码太复杂了,可以变得更简单,或者更符合逻辑:)

有什么建议吗

我的代码:

        private void button11_Click(object sender, EventArgs e)
    {
        Int32 i,j;
        byte temp;
        Random r = new Random();
        richTextBox5.Clear();
        richTextBox6.Clear();
        for (i = 0; i < 10; i++)
        {
            Matrix[i] =  Convert.ToByte(r.Next(0,255));// initialize the matrix with random bytes 0-255
            richTextBox5.Text += Convert.ToString(Matrix[i], 2).PadLeft(8, '0')+"\n";//print it
        }

        for (i = 0; i < 8; i++)
        {
            Matrix_res10[i] = 0;
            for (j = 0; j < 10; j++) 
            {
                temp = (byte)(Matrix[j] << i);
                temp = (byte)(temp >> 7);
                Matrix_res10[i] += temp*(long)(Math.Pow(2, 9-j)); //convert the bits to a int
            }
        }

        for (i = 0; i < 8; i++)
        {
            richTextBox6.Text += Convert.ToString(Matrix_res10[i],2).PadLeft(10,'0') + "\n";
        }
    }
private void按钮11\u单击(对象发送者,事件参数e)
{
int32i,j;
字节温度;
随机r=新随机();
richTextBox5.Clear();
richTextBox6.Clear();
对于(i=0;i<10;i++)
{
矩阵[i]=Convert.ToByte(r.Next(0255));//使用随机字节0-255初始化矩阵
richTextBox5.Text+=Convert.ToString(矩阵[i],2).PadLeft(8,'0')+“\n”;//打印它
}
对于(i=0;i<8;i++)
{
矩阵_res10[i]=0;
对于(j=0;j<10;j++)
{
temp=(字节)(矩阵[j]>7);
矩阵_res10[i]+=temp*(long)(Math.Pow(2,9-j));//将位转换为整数
}
}
对于(i=0;i<8;i++)
{
richTextBox6.Text+=Convert.ToString(矩阵_res10[i],2).PadLeft(10,'0')+“\n”;
}
}

您所要做的就是计算
i
th项的
j
th位:

  byte[] Matrix = new byte[] {
    0b01111011,
    0b10001100,
    0b10101101,
    0b10100001,
    0b11010110,
    0b00011100,
    0b00111000,
    0b11001111,
    0b01111011,
    0b10101010,
  };

  // 8 - byte has 8 bits; more exact: new int[sizeof(byte) * 8]; 
  // int[] - we have to store 10 bits, that's why byte is not long enough
  int[] Matrix_res10 = new int[8];

  for (int i = 0; i < Matrix_res10.Length; ++i) 
    for (int j = 0; j < Matrix.Length; ++j) 
      Matrix_res10[i] |= ((Matrix[j] >> (Matrix_res10.Length - i - 1)) & 1) << 
                          (Matrix.Length - j - 1);
结果:

0111100101
1000100110
1011001011
1000111010
1110011111
0110110100
1000100111
1011000110

在这里,一点二进制算术可能会有所帮助:

static int[] Transpose(byte[] x) {
    var result = new int[8];
    for (int i = 7; i >= 0; i--) {
        for (int j = 0; j < x.Length; j++) {
            // get i-th bit of byte
            var mask = 1 << i;
            var bit = (x[j] & mask) >> i;
            // set that bit at j-th position of target number                                        
            result[7 - i] |= bit << (x.Length - 1 - j);
        }
    }

    return result;
}
静态int[]转置(字节[]x){
var结果=新整数[8];
对于(int i=7;i>=0;i--){
对于(int j=0;ji;
//将该位设置在目标编号的第j个位置

结果[7-i]|=非常感谢,Dmitry。根据您的代码更改了我的代码,现在大约比我的代码快7倍(用秒表延时计测量)
static int[] Transpose(byte[] x) {
    var result = new int[8];
    for (int i = 7; i >= 0; i--) {
        for (int j = 0; j < x.Length; j++) {
            // get i-th bit of byte
            var mask = 1 << i;
            var bit = (x[j] & mask) >> i;
            // set that bit at j-th position of target number                                        
            result[7 - i] |= bit << (x.Length - 1 - j);
        }
    }

    return result;
}