2010-11-24 2 views
1

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

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

//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. Кто-нибудь может мне помочь?

ответ

4

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


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

+0

В любом случае, чтобы вернуть позицию, а не значение бита? Для примера, я делаю то, что вы сказали. Положение 1,2,4 установлено (значение 1,2,8). Однако мне нужно, чтобы они вернули позиции ... не значение этой позиции. Так что мне нужен мой новый массив, чтобы перечислить 1 2 4 не 1 2 8. – Tom 2010-11-24 17:23:25

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