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

C# 获取、设置、读取、按位转换C中的短类型值#,c#,bit-manipulation,bitwise-operators,bit-shift,bitwise-and,C#,Bit Manipulation,Bitwise Operators,Bit Shift,Bitwise And,我有一个短值X: short X=1; //Result in binary: 0000000000000001 我需要将它们拆分成一个数组并设置位(比如位6和位10)//结果为二进制:000000100001 我需要把它转换回短X值 我怎样才能无痛地做这件事? 您能帮忙吗?如果您有一个int值“intValue”,并且您想在“bitPosition”位置设置一个特定的位,请执行以下操作: intValue=intValue |(1Linq解决方案,简洁,但可能不如foreachloop可

我有一个短值X:

short X=1;  //Result in binary: 0000000000000001 
  • 我需要将它们拆分成一个数组并设置位(比如位6和位10)//结果为二进制:000000100001
  • 我需要把它转换回短X值
  • 我怎样才能无痛地做这件事? 您能帮忙吗?

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

    intValue=intValue |(1Linq解决方案,简洁,但可能不如
    foreach
    loop可读:

      using System.Linq;
    
      ...
    
      short X = 1;
      var bitsToSet = new[] { 5, 9 };
    
      var result = X | bitsToSet.Aggregate((s, a) => s |= 1 << a);
    

    1.手动解决方案

    设置第6位和第10位:

    myValue |= (1 << 6)|(1 << 10);
    
    myValue &= ~((1 << 6)|(1 << 10));
    
    转换回短字符:

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

    设置位是一个非常简单的过程,但我看不到在之后检索原始短值背后的模式(除非您总是设置第6位和第10位)。我也不确定“将它们拆分为一个数组”是什么意思。拆分为数组只是一个建议。你有没有一个好的解决方法?我是新手。你是否需要能够将更改后的短码转换回原始短码?这可以通过使用
    Aggregate
    的重载和将
    X
    设置为初始种子来简化。例如
    bitsToSet。骨料(X,(s,a)=>s|=1@Abion47:
    X
    short
    类型,当
    1@MongZhu我设置位6和10,如果第一位被视为位0。大概,OP将他的第一位视为位1。不管怎样,这是他给出的一个示例,而不是要求。这仍然完成了他需要的工作。@MongZhu我会说位通常是标记为起始位0,因为它与它们所表示的2的幂对齐(即2^0=1、2^1=2、2^2=4等)。@Abion47好的,您是对的,位的编号从零开始,因此OP将其编号为错误的,与预期输出相比。
    
    var raw = new byte[2];
    bits.CopyTo(raw, 0);
    var asShort = BitConverter.ToInt16(raw, 0);
    
    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