我有一个问题,我需要将两个u短数字转换为1和2到1个字节。像
0 0 1 0
的值为2和0 0 0 1
的值为1
所以结果我得到一个值为00100001
的字节,有可能,我不是一个高级低端编码器。
答案 0 :(得分:1)
这应该有效:
(byte)(((value1 & 0xF)<<4) | (value2 & 0xF))
答案 1 :(得分:0)
我不是高级底层编码器。
好,现在是时候成为一体了!
编辑:回答此问题之前,问题已经足够清楚,以至于无法确切理解需要什么。查看其他答案。
在两个数字上使用“位掩码”,然后对它们进行按位或运算。
我还不太清楚您到底想要什么,但是假设您想要第一个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
这里,我们不需要移动位,因为它们已经在我们想要的位置了。
然后,我们将它们按位进行“或”运算:
byte b1 = (byte)(u1_first4bits | u2_last4bits);
//b1 is now 10101000 which is 168
说明:
u1_first4bits 0000 0000 1010 0000
u2_last4bits 0000 0000 0000 1000
bitwise-OR 0000 0000 1010 1000
请注意,u1_first4bits
和u2_first4bits
的类型必须为int
-这是因为C#按位运算返回int
。要创建byte b1
,我们必须将bitwase-OR操作强制转换为一个字节。
答案 2 :(得分:0)
假设您要采用2个ushort(每个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个字节。但这不是正确的“转换”。