C#-数组转置位电平
我有一个10x8位(字节)的数组,名为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
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;
}