2013-07-07 13 views
0

Мне нужна помощь в C# ..
Мне нужно разработать модуль на C#, который будет потреблять много CPU & ОЗУ, каждый бит подсчитывается !!
Я должен создать список, в котором будут храниться структуры, одно из полей будет настроенным целым числом.
Целое число может быть только 0,1,2 (двоичное: 00,01,10) - поэтому мне не нужно целое число больше 2 бит.
Это предпочтительнее самого маленького встроенного целочисленного байта, который имеет 8 бит.
Мне нужно, чтобы новое целое число функционировало как регулярное целое число, поэтому мне не нужно использовать отливку (очень дорого) или любые другие специальные операции, когда я пытаюсь выполнить простое присвоение значения или любой простой арифметический расчет.
Есть ли способ определить индивидуальное целое внутри структуры, не изменяя остальную часть моего кода в основной программе?
Если бы вы, пожалуйста, напишите мне короткую структуру или передать мне подобную реализацию я больше всего ценю
Большого спасибоСписок настраиваемых целых чисел

+1

'ushort' занимает 16 бит. 'byte' является наименьшим с 8 бит. – Blorgbeard

+1

Но вы уверены, что вам это нужно? Сколько из этих целых чисел нужно хранить? Для этого потребуется больше процессора, потому что современные процессоры оптимизированы для 32 или 64-битных значений. – Blorgbeard

+0

Сказав все это, я предполагаю, что вы могли бы реализовать что-то, что использовало [BitArray] (http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx) под компактным хранилищем. – Blorgbeard

ответ

5

«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)); 
    } 
    } 

}