关于C#中“自定义”整数的一个可能愚蠢的问题

时间:2010-10-28 13:57:20

标签: c#

下午好,

这可能听起来像一个愚蠢的问题,但如果有办法解决这个问题会非常有用...有没有什么方法可以获得自定义位深度整数(例如,一个20位整数) C#?

非常感谢。

5 个答案:

答案 0 :(得分:9)

构建一个采用32位整数的结构,并用蓝色掩码它  0000 0000 0000 1111 1111 1111 1111 1111或(0x08FF
在将其存储在内部私有字段之前。

   public struct TwentyBitInt
   {
      private const int mask = 0x08FF;
      private int val;
      private bool isDef;


      private TwentyBitInt(int value)
      {
         val = value & mask;
         isDef = true;
      }
      public static TwentyBitInt Make(int value) 
      { return new TwentyBitInt(value); }

      public int Value { get { return val; } }
      public bool HasValue { get { return isDef; } }

      public static TwentyBitInt Null = new TwentyBitInt();

      public static explicit operator int (TwentyBitInt twentyBit)
      { 
          if (!HasValue) throw new ArgumentNullValueException(); 
          return twentyBit.val;
      }
      public static implicit operator TwentyBitInt (int integerValue)
      { return Make(integerValue); }

      // etc.
    }

您还可以适当地重载算术运算符,以便算术运算与它们将要使用的域的业务规则一致。

答案 1 :(得分:3)

我认为你可以,但这并不容易。您可以使用BitArray之类的东西来创建任意长度的位串。然后你必须自己编写所有代码,将其视为整数。那是困难的部分。

答案 2 :(得分:2)

虽然你无法在内存中创建一个完全符合“20位”的结构,但你可以创建自己的结构,它将“表现得像”一个20位数据类型(通过存储一个私有的“常规”数据类型,并在公共setter中使用按位运算符来仅保留所需的位。)

struct TwoBits
{
    int m_data;

    public int Data
    {
        set
        {
            m_data = 0x03 & value;
        }
        get
        {
            return m_data;
        }
    }
}

答案 3 :(得分:1)

好问题。大多数情况下,答案取决于你需要做什么。

几年前,我做了类似的事情来维持学校的研究项目。我们有一个自定义整数类型,但它不一定由位深度本身定义。这是一个主要因素(有余数)表示。这对于它应该做的事情来说非常方便,这是多次而且非常大的数字。加法和减法都很差。

还有许多其他“自定义”数字实现,非常常见的是自定义固定点表示(通常在游戏中实现确定性物理模拟时可见)。关于这个主题可能有一些很好的溢出帖子。对于如何抽象然后实现自定义数字表示的想法,这将是一个良好的开端。

如果设置了可变位深度整数表示,请考虑包装内部表示。一种可能性是使用IEnumerable<byte>并在其幅度增加时逐字节地扩展它。编写针对动态范围的运算符。这可能不一定是最佳表现形式或最佳表现形式,但它可能是最简单的。

另一种可能的解决方案可能是做类似的事情,但使用'ulong'。不是节省空间,但我们受益于64位操作。

只是spitballing:)

希望这有帮助!

答案 4 :(得分:0)

也许检查运算符重载并设计一个自定义类(可能比你想做的工作多)。 http://www.c-sharpcorner.com/UploadFile/prasadh/OperatorOverloading11142005003229AM/OperatorOverloading.aspx