使用C#设置字节数组中的位

时间:2019-11-15 12:06:06

标签: c#

我需要从一个短整数值编码一个字节数组 编码规则是 代表整数的位是0-13位 如果数字为负,则设置位14 位15始终为1。 我知道我可以使用BitConverter将整数放入字节数组

byte[] roll = BitConverter.GetBytes(x);

但是我找不到满足我要求的方法 有人知道该怎么做吗?

2 个答案:

答案 0 :(得分:2)

您应该使用Bitwise Operators

解决方案是这样的:

 Int16 x = 7;

 if(x < 0)
 {
        Int16 mask14 = 16384; // 0b0100000000000000;
        x = (Int16)(x | mask14);
 }
 Int16 mask15 = -32768; // 0b1000000000000000;
 x = (Int16)(x | mask15);
 byte[] roll = BitConverter.GetBytes(x);

答案 1 :(得分:2)

您不能依靠GetBytes来获取负数,因为它可以补充位,而这并不是您所需要的。

相反,您需要进行边界检查以确保该数字可表示,然后在给定数字的绝对值上使用GetBytes。

该方法的参数为'short',因此我们的GetBytes返回一个字节数组,其大小为2(您不需要超过16位)。

其余内容在下面的评论中:

        static readonly int MAX_UNSIGNED_14_BIT = 16383;// 2^14-1

        public static byte[] EncodeSigned14Bit(short x)
        {
            var absoluteX = Math.Abs(x);
            if (absoluteX > MAX_UNSIGNED_14_BIT) throw new ArgumentException($"{nameof(x)} is too large and cannot be represented");

            byte[] roll = BitConverter.GetBytes(absoluteX);

            if (x < 0)
            {
                roll[1] |= 0b01000000; //x is negative, set 14th bit 
            }

            roll[1] |= 0b10000000; // 15th bit is always set

            return roll;
        }
        static void Main(string[] args)
        {
            // testing some values
            var r1 = EncodeSigned14Bit(16383); // r1[0] = 255, r1[1] = 191
            var r2 = EncodeSigned14Bit(-16383); // r2[0] = 255, r2[1] = 255
        }