[英]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.