Поскольку при фиксированном значении 8 бит достаточно только «табличного» поиска снизу - при работе с простым byte
поиск, вероятно, самый быстрый способ. Однако дополнительные издержки BitSet для получения / установки данных могут свести на нет преимущество поиска. Также необходимо учитывать начальную стоимость сборки и постоянные накладные расходы (но значения могут быть закодированы в литерал массива ... ick!)
С другой стороны, если данные только 8 бит (когда-либо) и «важна производительность», зачем вообще использовать BitArray? BitArray всегда можно использовать для приятных функций, таких как «взрыв» для Enumerable, в то время как C # уже имеет встроенную функцию приличного управления битами.
Предполагая более общий случай, когда данные выровнены по 8 битам ... но имеют некоторую неопределенную длину
Действительно ли это лучше (быстрее, эффективнее и т. Д.), Чем просто делать это «для каждого элемента» в BitArray? Понятия не имею но не подозреваю. Я бы определенно начал с «простых» методов - это здесь просто для подтверждения концепции и может (или не может быть) интересно сравнить в тесте. Во всяком случае, напишите сначала для ясности ... и ниже не так! (В этом есть хотя бы одна ошибка - я обвиняю в дополнительной сложности; -)
byte reverse (byte b) {
byte o = 0;
for (var i = 0; i < 8; i++) {
o <<= 1;
o |= (byte)(b & 1);
b >>= 1;
}
return o;
}
byte[] table;
BitArray reverse8 (BitArray ar) {
if (ar.Count % 8 != 0) {
throw new Exception("no!");
}
byte[] d = new byte[ar.Count / 8];
ar.CopyTo(d, 0);
// this only works if the bit array is
// a multiple of 8. we swap bytes and
// then reverse bits in each byte
int mid = d.Length / 2;
for (int i = 0, j = d.Length - 1; i < mid; i++, j--) {
byte t = d[i];
d[i] = table[d[j]];
d[j] = table[t];
}
return new BitArray(d);
}
string tostr (BitArray x) {
return string.Join("",
x.OfType<bool>().Select(i => i ? "1" : "0").ToArray());
}
void Main()
{
table = Enumerable.Range(0,256).Select(v => reverse((byte)v)).ToArray();
{
byte[] s = new byte[] { 1, 0xff };
BitArray ar = new BitArray(s);
// linqpad :)
tostr(ar).Dump();
tostr(reverse8(ar)).Dump();
}
"--".Dump();
{
byte[] s = new byte[] { 3, 42, 19 };
BitArray ar = new BitArray(s);
// linqpad :)
tostr(ar).Dump();
tostr(reverse8(ar)).Dump();
}
}
Выход:
1000000011111111
1111111100000001
--
110000000101010011001000
000100110101010000000011
expr.Dump()
- это LINQPad функция.