c#使用低位和高位将两个ushort值转换为一个字节

c#使用低位和高位将两个ushort值转换为一个字节,c#,binary,C#,Binary,我有一个问题,我需要转换成两个u短数字,比如说1和2到1字节。差不多 0 0 1 0值2和0 0 1值1 因此,在结果中,我得到一个值为00100001的字节,是否可能,我不是一个主低级编码器。这应该可以: (byte)(((value1 & 0xF)<<4) | (value2 & 0xF)) (字节)((值1和0xF) 我不是一个精通低级编码的人 好吧,现在是时候成为一个了 编辑:此答案是在问题清楚到完全理解所需内容之前做出的。请参阅其他答案 在两个数字上使用

我有一个问题,我需要转换成两个u短数字,比如说1和2到1字节。差不多

0 0 1 0
值2和
0 0 1
值1

因此,在结果中,我得到一个值为
00100001
的字节,是否可能,我不是一个主低级编码器。

这应该可以:

 (byte)(((value1 & 0xF)<<4) | (value2 & 0xF))
(字节)((值1和0xF)
我不是一个精通低级编码的人

好吧,现在是时候成为一个了

编辑:此答案是在问题清楚到完全理解所需内容之前做出的。请参阅其他答案

在两个数字上使用“位掩码”,然后按位或同时使用。
我不太清楚您到底想要什么,但假设您想要第一个
ushort
的前4位,然后是第二个
ushort
的最后4位。注意:
ushort
是16位宽

ushort u1 = 44828; //10101111 00011100 in binary
ushort u2 = 65384; //11111111 01101000 in binary

int u1_first4bits = (u1 & 0xF000) >> 8;
“掩码”为0xF000。它在u1上屏蔽:

44828         1010 1111 0001 1100
0xF000        1111 0000 0000 0000
bitwise-AND   1010 0000 0000 0000
问题是,这个新数字仍然是16位长 -我们必须用
>8
将其移位8位,使其成为
0000 0000 1010 0000

然后对第二个数字执行另一个掩码操作:

int u2_last4bits  =  u2 & 0x000F;
插图:

65384         1111 1111 0110 1000
0x000F        0000 0000 0000 1111
bitwise-AND   0000 0000 0000 1000
u1_first4bits 0000 0000 1010 0000
u2_last4bits  0000 0000 0000 1000
bitwise-OR    0000 0000 1010 1000
在这里,我们不需要移动位,因为它们已经在我们想要的地方了。
然后我们按位或将它们放在一起:

byte b1 = (byte)(u1_first4bits | u2_last4bits);
//b1 is now 10101000 which is 168
插图:

65384         1111 1111 0110 1000
0x000F        0000 0000 0000 1111
bitwise-AND   0000 0000 0000 1000
u1_first4bits 0000 0000 1010 0000
u2_last4bits  0000 0000 0000 1000
bitwise-OR    0000 0000 1010 1000

请注意,
u1\u first4bits
u2\u first4bits
需要类型为
int
——这是因为按位C操作返回
int
。要创建
字节b1
,我们必须将位或操作强制转换为一个字节。

假设,您想要获取2个U端口(每个16位)并将它们转换为32位表示(整数),您可以使用“BitArray”类,用4字节数组填充它,然后将其转换为整数

以下示例将产生:

 00000000 00000010 00000000 00000001
那是

 131073
作为整数

ushort x1 = 1;
ushort x2 = 2;

//get the bytes of the ushorts. 2 byte per number. 
byte[] b1 = System.BitConverter.GetBytes(x1);
byte[] b2 = System.BitConverter.GetBytes(x2);

//Combine the two arrays to one array of length 4. 
byte[] result = new Byte[4];
result[0] = b1[0];
result[1] = b1[1];
result[2] = b2[0];
result[3] = b2[1];

//fill the bitArray.
BitArray br = new BitArray(result);

//test output.
int c = 0;
for (int i = br.Length -1; i >= 0; i--){

    Console.Write(br.Get(i)? "1":"0");
    if (++c == 8)
    {
        Console.Write(" ");
        c = 0;
    }
}

//convert to int and output. 
int[] array = new int[1];
br.CopyTo(array, 0);
Console.WriteLine();
Console.Write(array[0]);

Console.ReadLine();

当然,你可以改变这个例子,每个ushort扔掉1个字节。但这不是一个正确的“转换”。ushort已经是两个字节了,你想取其中的2个值,用一个字节来表示它们吗?使用C#7,你甚至可以用二进制文字来写位掩码,即
(u1&0b1111_0000_0000_0000_0000)>>8
,而不是
(u1&0xF000)>>8
,这可能会使哪些位受到影响更清楚。@ckuri,谢谢你,我已经忘记了这一点。在这个例子中,十六进制就足够了,但你是对的,更复杂的掩码用这种方式会更好!