2010-11-05 2 views
3

Есть ли альтернатива BitArray для .NET Micro Framework? Я думал просто использовать bool [], но как вы можете преобразовать его обратно в байт []?Альтернатива BitArray для .NET Micro Framework

В полной структуры, с учетом «бит» является BitArray, следующие работы:

byte[] data = new byte[dimensions/8]; 
bits.CopyTo(data, 0); 

Но я не могу найти класс BitArray в микро рамках

+1

Что именно вам нужно? Может быть, 'byte', который вы можете манипулировать, достаточно? – Bobby

+0

BitArray реализован с использованием целых чисел и побитовых операторов –

+0

@Bobby nope действительно необходимо для работы на уровне бит :-) – TimothyP

ответ

5

Это не очень трудно дублируйте функциональность BitArray. Во-первых, если вам нужно меньше 65 бит, вы можете сделать это с помощью long или меньше.

Чтобы установить отдельный бит:

void Set(ref long ba, int bit) 
{ 
    ba |= 1L << bit; 
} 

Чтобы очистить немного:

void Clear(ref long ba, int bit) 
{ 
    long mask = 1L << bit; 
    mask = ~mask; 
    ba &= mask; 
} 

Чтобы увидеть, если бит установлен:

bool IsSet(long ba, int bit) 
{ 
    long mask = 1L << bit; 
    return (ba & mask) != 0; 
} 

Если у вас есть более чем 64 бит, то вам нужно будет создать массив (byte[], возможно), и выполните деление, чтобы определить, какой бит/бит вы хотите использовать dify. Приведенные выше методы будут работать, если вы измените long на byte.

Например, если у вас есть:

byte[] myBytes = new byte[128]; 

У вас есть 1024 бит.

Чтобы установить бит:

void Set (int bit) 
{ 
    int byte = bit/8; 
    int bitIndex = bit%8; 
    myBytes[byte] |= (byte)(1 << bitIndex); 
} 

другие методы используют тот же математику, чтобы получить байт и битовый индекс и настройки, очистки и тестирования немного такой же, как с long приведенном выше примере.

+0

Awesome! Спасибо ! – TimothyP

+2

Если 'Interlocked.CompareExchange' доступен на микроархитектуре, можно использовать это, чтобы сделать любые требуемые типы бит-операций атомарными. Внутри цикла прочитайте старое значение слова, вычислите новое значение и «CompareExchange» старое значение для нового; reloop, пока «CompareExchange» не удастся. Мне лично нравится иметь атомный метод для вычисления 'Thebits = (TheBits & ~ Mask)^NewBits)'. Биты, которые ясны в 'Mask' и' NewBits', оставлены в покое; те, которые понятны в 'Маске' и установлены в' NewBits', переключаются. Биты, установленные в 'Mask', будут скопированы из' NewBits'. – supercat

2

Вы можете найти реализацию BitArray в стеке 802.15.4. Просто выполните поиск в Porting Kit для BitArray.cs

Смежные вопросы