簡體   English   中英

關於C#中“自定義”整數的一個可能愚蠢的問題

[英]A possibly silly question about “custom” integers in C#

下午好,

這可能聽起來像一個愚蠢的問題,但如果有辦法解決這個問題會非常有用......有什么方法可以在C#中獲得自定義位深度整數(例如,20位整數)?

非常感謝你。

構建一個采用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.
    }

您還可以適當地重載算術運算符,以便算術運算與它們將要使用的域的業務規則一致。

我想你可以,但這並不容易。 您可以使用類似BitArray的東西來創建任意長度的位串。 然后你必須自己編寫所有代碼,將其視為整數。 那是困難的部分。

雖然您無法在內存中創建一個完全符合“20位”的結構,但您可以創建自己的結構,其“行為”類似於20位數據類型(通過存儲私有的“常規”數據類型,並使用按位公共設置器中的運算符只保留所需的位)。

struct TwoBits
{
    int m_data;

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

好問題。 大多數事情,答案取決於你需要做什么。

幾年前我做了類似的事情來維持學校的研究項目。 我們有一個自定義整數類型,但它不一定由位深度本身定義。 這是一個主要因素(有余數)表示。 這對於它應該做的事情來說非常方便,這是多次而且非常大的數字。 加法和減法都很差。

還有許多其他“自定義”數字實現,非常常見的是自定義固定點表示(通常在游戲中實現確定性物理模擬時可見)。 關於這個主題可能有一些很好的溢出帖子。 對於如何抽象然后實現自定義數字表示的想法,這將是一個良好的開端。

如果設置為可變位深度整數表示,請考慮包裝內部表示。 一種可能性是使用IEnumerable<byte>並在其幅度增加時逐字節地擴展它。 編寫針對動態范圍的運算符。 這可能不一定是最佳表現形式或最佳表現形式,但它可能是最簡單的。

另一種可能的解決方案可能是做類似的事情,但使用'ulong'。 不是節省空間,但我們受益於64位操作。

只是spitballing :)

希望這可以幫助!

也許檢查運算符重載並設計一個自定義類(可能比你想做的工作多)。 http://www.c-sharpcorner.com/UploadFile/prasadh/OperatorOverloading11142005003229AM/OperatorOverloading.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM