Поиск набора битов целого числа - PullRequest
2 голосов
/ 24 ноября 2010

Хорошо, есть вопрос. Я собрал немного маску для вариантов. По сути, на моей странице есть список, в котором можно выбрать несколько элементов и сохранить их в списке целых чисел (их значение ID). Всего существует 14 вариантов (так ID ID 1-15). Причина, по которой я собираю это в битовую маску, состоит в том, что я не хочу жестко кодировать число в случае, если я хочу добавить опции в таблицу базы данных (откуда заполняется список). Кроме того, я не хочу отправлять 14 параметров в мою хранимую процедуру SQL (таким образом, жесткое кодирование в числе 14). Я могу отправить это целое число и разобрать его (следующий шаг).

Однако сейчас мне нужно выяснить, какие биты установлены в моем целом числе по другой причине. В основном у меня есть собственность. Метод get собирает битовую маску из списка целых чисел (полученных по выбору пользователя) и возвращает целое число этого двоичного десятичного значения. Вот мой собранный код для построения битовой маски.

//optsNum is my integer list. This is the list containing the ID nums of the selections.
//so if the user selects the first, second, and fourth option, the list contains 1,2,4 (count 3)
//typeCount is an integer of the amount of options in the list box
int total = 0;
for (int c = 0; c < optsNum.Count(); ++c)
{
    for (int i = 0; i <= typeCount; i++)
    {
        if ((i + 1) == optsNum[c})
            total += (1 << i);
    }
}
return total;

Так что, если заданы первое, второе и четвертое, мое целое число равно 11. Это работает, я проверил все выборки и возвращает правильное целое / десятичное значение.

Сейчас мне нужна помощь в создании метода сетов. Для этого нужно взять десятичное / целое число, которое у меня есть, выяснить, какие биты установлены, и поместить их обратно в список. Так что, если у меня есть 11 в качестве значения, мне нужно положить в список целых чисел 1,2,4. Кто-нибудь может мне помочь?

1 Ответ

4 голосов
/ 24 ноября 2010

Вместо этого следует использовать BitArray класс ;он выполняет побитовые операции за вас и имеет простой интерфейс.
Если вам никогда не понадобится больше 32 логических значений, вы также можете использовать BitVector32 класс , который меньше.


Чтобы ответить на ваш вопрос, вам нужно перебрать каждый бит (используя простой цикл for) и проверить value & (1 << i), чтобы увидеть, установлен ли i-й бит.

...