下午好,
这可能听起来像一个愚蠢的问题,但如果有办法解决这个问题会非常有用...有没有什么方法可以获得自定义位深度整数(例如,一个20位整数) C#?
非常感谢。
答案 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