C# 在ushort中编码字节,然后再返回

C# 在ushort中编码字节,然后再返回,c#,bit-manipulation,bit-shift,short,C#,Bit Manipulation,Bit Shift,Short,我正试图在一个ushort中存储两个字节。所以前8位是第一个值,最后8位是最后一个值。我几乎让它工作了,但我在第20行发现了这个错误,在那里我将移位: Severity Code Description Project File Line Suppression State Error CS0266 Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists (are

我正试图在一个ushort中存储两个字节。所以前8位是第一个值,最后8位是最后一个值。我几乎让它工作了,但我在第20行发现了这个错误,在那里我将移位:

Severity    Code    Description Project File    Line    Suppression State
Error   CS0266  Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists (are you missing a cast?)   Bit Stuff   C:\Users\perqj\Dropbox\GM\Bit Stuff\Bit Stuff\Form1.cs  42  Active
代码如下:

        byte val1 = 1;
        byte val2 = 1;

        byte[] val = new byte[2];

        val[0] = val1;
        val[1] = val2;

        ushort asShort = BitConverter.ToUInt16(val, 0);

        ushort mask1 = 0x00ff; //0b_0000_0000_1111_1111    Haven't tried, yet
        ushort mask2 = 0xff00; //0b_1111_1111_0000_0000    Haven't tried, yet

        ushort short1 = asShort;
        ushort short2 = asShort;
        ushort byteShift = 8;

        short1 &= mask1;
        short2 &= mask2;

        short2 = short2 >> byteShift;

        string binaryMask1 = Convert.ToString(mask1, 2);
        string binaryMask2 = Convert.ToString(mask2, 2);
        string binaryShort1 = Convert.ToString(short1, 2);
        string binaryShort2 = Convert.ToString(short2, 2);

        listBox1.Items.Add("val1: " + val1);
        listBox1.Items.Add("val2: " + val2);
        listBox1.Items.Add("Short: " + asShort);
        listBox1.Items.Add("mask1: " + mask1 + "  " + binaryMask1);
        listBox1.Items.Add("mask2: " + mask2 + "  " + binaryMask2);
        listBox1.Items.Add("val1: " + short1 + "  " + binaryShort1);
        listBox1.Items.Add("val2: " + short2 + "  " + binaryShort2);

我通常使用如下代码:

    class Program
    {
        static void Main(string[] args)
        {
            byte[] input = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
            Data[] output = input.Select((x,i) => new {x = x, i = i}).GroupBy(x => x.i/2).Select(x => new Data() { upper = x.First().x, lower = x.Last().x}).ToArray(); 
        }
    }
    public class Data
    {
        public byte upper { get; set; }
        public byte lower { get; set; }
    }

是的,位移位的结果是
int
——但是正如错误所说,您可以添加一个强制转换:
short2=(ushort)(short2>>byteShift)
您可能会发现
short2>>=byteShift也可以工作-这是等效的,只需使用隐式cast.Ahh。当然,位移位“返回”一个int。为什么我没想到呢。谢谢,现在起作用了。现在还不清楚这与这个问题有什么关系——问题在哪里可以通过演员阵容解决。