C # - уровень битов транспонирования массива - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть массив 10 x 8 бит (байт) с именем Matrix[10], например,

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

Я хочу создать еще один массив с именем Matrix_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";
        }
    }

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Здесь может помочь немного двоичной арифметики:

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;
}
0 голосов
/ 26 апреля 2018

Все, что вам нужно сделать, это вычислить, что является j -ым битом i-го элемента:

  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);

Давайте посмотрим на результат:

  string report = string.Join(Environment.NewLine, Matrix_res10
    .Select(item => Convert.ToString(item, 2).PadLeft(Matrix.Length, '0')));

  Console.Write(report);

Итог:

0111100101
1000100110
1011001011
1000111010
1110011111
0110110100
1000100111
1011000110
...