Почему BitConverter возвращает байты и как я могу получить биты?
В качестве входных данных я получаю int (ну, на самом деле строку, которую я должен преобразовать в int).
Этот int должен быть преобразован в биты.
Для каждой позиции бита, которая имеет 1, я должен получить позицию.
В моей базе данных я хочу, чтобы все записи, которые имеют поле значения типа int, имеют эту позицию в качестве значения.
В настоящее время у меня есть следующий простой код, который должен спросить мою сущность (содержащую databaseValue), соответствует ли она позиции, но, очевидно, не работает правильно:
Byte[] bits = BitConverter.GetBytes(theDatabaseValue);
return bits[position].equals(1);
Во-первых, у меня есть массив байтов, потому что там явно нет битового типа. Должен ли я использовать Boolean[]? Тогда как я могу заполнить этот массив? Наконец, если предыдущие операторы решены, я должен просто вернуть биты [позиция]
Я чувствую, что это нужно как-то решить с помощью битовых масок, но я не знаю, с чего начать..
Любая помощь будет оценена
3 ответа
Ваше чувство верно. Это должно быть решено с помощью битовых масок. BitConverter не возвращает биты (и как это может быть? "Биты" не являются фактическим типом данных), он конвертирует необработанные байты в типы данных CLR. Всякий раз, когда вы хотите извлечь биты из чего-то, вы должны думать о битовых масках.
Если вы хотите проверить, установлен ли бит в определенной позиции, используйте оператор &. Побитовый & является истинным, только если установлены оба бита. Например, если у вас есть два байта 109 и 33, результат & будет
0110 1101 & 0010 0001 ----------- 0010 0001
Если вы просто хотите увидеть, установлен ли бит в int, вы и его число, для которого установлен только проверяемый бит (т. Е. 1, 2, 4, 8, 16, 32 и т. Д.), И проверьте если результат не ноль.
List<int> BitPositions(uint input) {
List<int> result = new List<int>();
uint mask = 1;
int position = 0;
do {
if (input & mask != 0) {
result.Add(position);
}
mask <<= 1;
position++;
} while (mask != 0);
return result;
}
Я подозреваю, что BitArray - это то, что вам нужно. В качестве альтернативы, использование битовых масок самостоятельно не сложно:
for (int i=0; i < 32; i++)
{
if ((value & (1 << i)) != 0)
{
Console.WriteLine("Bit {0} was set!", i);
}
}
Не используйте Boolean. Хотя логическое значение имеет только два значения, оно на самом деле хранится с использованием 32 битов, таких как int.
РЕДАКТИРОВАТЬ: На самом деле, в форме массива логические значения будут упакованы в байты, а не 4 байта.