获取、设置、读取、按位转换为 C# 中的 Short 类型值

Get, Set, Read, converts bitwise in Short type value in C#

我有空值 X:

short X=1;  //Result in binary: 0000000000000001 
  1. 我需要将它们拆分成一个数组并设置位(比如第 6 位和第 10 位)//二进制结果:0000001000100001
  2. 我需要将它转换回短 X 值。

我怎样才能做到无痛? 你能帮忙吗?

如果你有一个 int 值 "intValue" 并且你想在位置 "bitPosition" 处设置一个特定位,请执行如下操作:

intValue = intValue | (1 << bitPosition);

或更短:

intValue |= 1 << bitPosition;

如果你想重置一点(即将其设置为零),你可以这样做:

intValue &= ~(1 << bitPosition);

(运算符 ~ 反转值中的每一位,因此 ~(1 << bitPosition) 将产生一个 int,其中除给定 bitPosition 处的位外,每个位都为 1。)

Linq 解决方案,更简洁,但可能不如 foreach 循环:

  using System.Linq;

  ...

  short X = 1;
  var bitsToSet = new[] { 5, 9 };

  var result = X | bitsToSet.Aggregate((s, a) => s |= 1 << a);

如果你坚持short添加cast:

  short result = (short) (X | bitsToSet.Aggregate((s, a) => s |= 1 << a));

1.手动解决

设置第 6 位和第 10 位:

myValue |= (1 << 6)|(1 << 10);

清除位 6 和 10:

myValue &= ~((1 << 6)|(1 << 10));

2。使用位数组

var bits = new BitArray(16); // 16 bits
bits[5] = true;
bits[10] = true;

转换回短:

var raw = new byte[2];
bits.CopyTo(raw, 0);
var asShort = BitConverter.ToInt16(raw, 0);

如果您指的是非常基本的加密,那么使用 XOR (^) 运算符可能更适合您的需要。

short FlipBytes(short original, params int[] bytesToSet)
{
    int key = 0;
    foreach (int b in bytesToSet)
    {
        if (b >= 0 && b < 16)
        {
            key |= 1 << b;
        }
    }

    return (short)(original ^ key);
}

此方法将设置和重置您想要的字节。例如:

short X = 1;
short XEncrypt = FlipBytes(X, 6, 10);
short XDecrypt = FlipBytes(XEncrypt, 6, 10);

// X        = 1    , Binary = 0000000000000001
// XEncrypt = 1089 , Binary = 0000010001000001
// XDecrypt = 1    , Binary = 0000000000000001