Почему BitConverter возвращает байты и как я могу получить биты? - PullRequest
0 голосов
/ 17 декабря 2008

В качестве ввода я получаю int (ну, на самом деле, строку, которую я должен преобразовать в int).
Это int должно быть преобразовано в биты.
Для каждой позиции бита, которая имеет 1, я должен получить позицию.
В моей базе данных я хочу, чтобы все записи, которые имеют поле значения int, имеют эту позицию в качестве значения.
В настоящее время у меня есть следующий простой код, который должен спросить мою сущность (содержащую databaseValue), соответствует ли она позиции, но, очевидно, не работает правильно:

Byte[] bits = BitConverter.GetBytes(theDatabaseValue);
return bits[position].equals(1);

Во-первых, у меня есть массив байтов, потому что, очевидно, нет битового типа. Должен ли я использовать Boolean []? Тогда как я могу заполнить этот массив? Наконец, если предыдущие операторы решены, я должен просто вернуть биты [позиция]

Мне кажется, что это нужно как-то решить с помощью битовых масок, но я не знаю, с чего начать ..

Любая помощь будет оценена

Ответы [ 3 ]

4 голосов
/ 17 декабря 2008

Ваше чувство верно. Это должно быть решено с помощью битовых масок. BitConverter не возвращает биты (и как это может быть? "Биты" не являются фактическим типом данных), он конвертирует необработанные байты в типы данных CLR. Всякий раз, когда вы хотите извлечь биты из чего-либо, вы должны думать о битовых масках.

Если вы хотите проверить, установлен ли бит в определенной позиции, используйте оператор &. Поразрядно & имеет значение true, только если установлены оба бита. Например, если у вас есть два байта 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;
}
4 голосов
/ 17 декабря 2008

Я подозреваю, BitArray - это то, что вам нужно. Кроме того, использовать битовые маски самостоятельно несложно:

for (int i=0; i < 32; i++)
{
    if ((value & (1 << i)) != 0)
    {
        Console.WriteLine("Bit {0} was set!", i);
    }
}
1 голос
/ 17 декабря 2008

Не используйте Boolean. Хотя логическое значение имеет только два значения, оно на самом деле хранится с использованием 32 битов, например int.

РЕДАКТИРОВАТЬ: На самом деле, в форме массива логические значения будут упакованы в байты, а не 4 байта.

...