获取,设置,读取,在C#中以短类型值逐位转换

时间:2017-05-12 10:29:55

标签: c# bit-manipulation bitwise-operators bit-shift bitwise-and

我有一个短值X:

short X=1;  //Result in binary: 0000000000000001 
  1. 我需要将它们分成一个数组并设置位(比如第6位和第10位)//结果为二进制:0000001000100001
  2. 我需要将其转换回短X值。
  3. 我怎么能无痛地做到这一点? 你能帮忙吗?

3 个答案:

答案 0 :(得分:0)

如果您有一个int值“intValue”并且您想在位置“bitPosition”设置一个特定位,请执行以下操作:

intValue = intValue | (1 << bitPosition);

或更短:

intValue |= 1 << bitPosition;

如果要重置一位(即将其设置为零),可以执行以下操作:

intValue &= ~(1 << bitPosition);

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

答案 1 :(得分:0)

<强> 1。手动解决方案

设置第6位和第10位:

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

清除第6位和第10位:

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

<强> 2。使用BitArray

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);

答案 2 :(得分: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