C# 自定义整数列表

C# 自定义整数列表,c#,struct,bit,C#,Struct,Bit,我需要一些C#方面的帮助。… 我需要用C语言开发一个模块,它将消耗大量的CPU和RAM,每一位都很重要 我假设创建一个包含结构的列表,其中一个字段将是自定义整数。 整数只能是0,1,2(二进制:00,01,10)-因此我不需要大于2位的整数。 这比具有8位的最小内置整数字节更可取。 我需要新的整数作为常规整数运行,因此当我尝试进行简单的赋值或任何简单的算术计算时,我不需要使用强制转换(非常昂贵)或任何其他特殊操作。 有没有一种方法可以让我在结构中定义自定义整数,而不更改主程序中的其余代码? 如果

我需要一些C#方面的帮助。…
我需要用C语言开发一个模块,它将消耗大量的CPU和RAM,每一位都很重要
我假设创建一个包含结构的列表,其中一个字段将是自定义整数。
整数只能是0,1,2(二进制:00,01,10)-因此我不需要大于2位的整数。
这比具有8位的最小内置整数字节更可取。
我需要新的整数作为常规整数运行,因此当我尝试进行简单的赋值或任何简单的算术计算时,我不需要使用强制转换(非常昂贵)或任何其他特殊操作。
有没有一种方法可以让我在结构中定义自定义整数,而不更改主程序中的其余代码?
如果您能给我写一个简短的结构或让我参考类似的实现,我将不胜感激
非常感谢

“ushort,有4位”

不,ushort是16位。一个字节是最小的,有8位

“有没有办法在结构中定义自定义整数, 不更改主程序中的其余代码?”

不,不能生成小于一个字节的结构,因此要生成只使用两个位的整数,必须更改保存它们的集合,以便它可以在单个字节中存储多个值

比如:

public class TwoBitArray {

  private int _len;
  private byte[] _data;

  public TwoBitArray(int size) {
    _len = size;
    _data = new byte[(size + 3) / 4];
  }

  public int this[int index] {
    get {
      if (index < 0 || index >= _len) throw new IndexOutOfRangeException();
      int ofs = index / 4;
      int shift = (index & 3) * 2;
      return (_data[ofs] >> shift) & 3;
    }
    set {
      if (index < 0 || index >= _len) throw new IndexOutOfRangeException();
      if (value < 0 || value > 3) throw new ArgumentOutOfRangeException();
      int ofs = index / 4;
      int shift = (index & 3) * 2;
      int mask = 3 << shift;
      _data[ofs] = (byte)((_data[ofs] & (255 - mask)) | (value << shift));
    }
  }

}
公共类两位数组{
私立国际学校;
专用字节[]_数据;
公共双位数组(整数大小){
_len=尺寸;
_数据=新字节[(大小+3)/4];
}
公共int这个[int索引]{
得到{
如果(索引<0 | |索引>=\u len)抛出新的索引AutoFrangeException();
int ofs=指数/4;
整数移位=(索引&3)*2;
返回(_data[ofs]>>shift)&3;
}
设置{
如果(索引<0 | |索引>=\u len)抛出新的索引AutoFrangeException();
如果(值<0 | |值>3)抛出新ArgumentOutOfRangeException();
int ofs=指数/4;
整数移位=(索引&3)*2;
整数掩码=3
“ushort,有4位”

不,ushort是16位。一个字节是最小的,有8位

“有没有办法在结构中定义自定义整数, 不更改主程序中的其余代码?”

不,不能生成小于一个字节的结构,因此要生成只使用两个位的整数,必须更改保存它们的集合,以便它可以在单个字节中存储多个值

比如:

public class TwoBitArray {

  private int _len;
  private byte[] _data;

  public TwoBitArray(int size) {
    _len = size;
    _data = new byte[(size + 3) / 4];
  }

  public int this[int index] {
    get {
      if (index < 0 || index >= _len) throw new IndexOutOfRangeException();
      int ofs = index / 4;
      int shift = (index & 3) * 2;
      return (_data[ofs] >> shift) & 3;
    }
    set {
      if (index < 0 || index >= _len) throw new IndexOutOfRangeException();
      if (value < 0 || value > 3) throw new ArgumentOutOfRangeException();
      int ofs = index / 4;
      int shift = (index & 3) * 2;
      int mask = 3 << shift;
      _data[ofs] = (byte)((_data[ofs] & (255 - mask)) | (value << shift));
    }
  }

}
公共类两位数组{
私立国际学校;
专用字节[]_数据;
公共双位数组(整数大小){
_len=尺寸;
_数据=新字节[(大小+3)/4];
}
公共int这个[int索引]{
得到{
如果(索引<0 | |索引>=\u len)抛出新的索引AutoFrangeException();
int ofs=指数/4;
整数移位=(索引&3)*2;
返回(_data[ofs]>>shift)&3;
}
设置{
如果(索引<0 | |索引>=\u len)抛出新的索引AutoFrangeException();
如果(值<0 | |值>3)抛出新ArgumentOutOfRangeException();
int ofs=指数/4;
整数移位=(索引&3)*2;

int mask=3
ushort
需要16位。
byte
是最小的,有8位。但是你确定你需要这个吗?你需要存储多少个整数?使用这些整数需要更多的CPU,因为现代CPU优化为32或64位值。说到这里,我想你可以实现一些使用u用于紧凑型存储的安德尼亚。当在结构中使用这种尺寸的东西时,也可能会出现对齐问题——实际结构可能比您预期的大(除非您使用
[StructLayout]
)。这不是很优雅,而且看起来很“昂贵”在运行时术语中..难道没有简单的东西不会弄乱其余的代码吗?
ushort
需要16位。
byte
是最小的8位。
byte
是最小的。但是你确定你需要这个吗?你需要存储多少这样的整数?处理这些整数需要更多的CPU,因为现代CPU优化为32或64位值说了这么多之后,我想你可以实现一些使用底层进行紧凑存储的东西。当在一个结构中使用这种大小的东西时,也可能会出现对齐问题——实际的结构可能比你预期的大(除非你使用
[StructLayout]
)。这不是很优雅,而且看起来很“昂贵”从运行时的角度来看……难道没有简单的东西不会弄乱代码的其余部分吗?