Есть несколько шагов для решения этой проблемы. Для начала нужно перечислить все возможные битовые карты. Как уже отмечали другие, вы можете легко сделать это, увеличив целое число от 0 до 2 ^ n - 1.
Получив это, вы можете перебрать все возможные битовые карты, вам просто нужен способ взять эту битовую карту и "применить" ее к массиву, чтобы сгенерировать сумму элементов по всем индексам, представленным картой. Следующий метод является примером того, как это сделать:
private static int bitmapSum(int[] input, int bitmap) {
// a variable for holding the running total
int sum = 0;
// iterate over each element in our array
// adding only the values specified by the bitmap
for (int i = 0; i < input.length; i++) {
int mask = 1 << i;
if ((bitmap & mask) != 0) {
// If the index is part of the bitmap, add it to the total;
sum += input[i];
}
}
return sum;
}
Эта функция принимает массив целых чисел и битовую карту (представленную как целое число) и возвращает сумму всех элементов в массиве, чей индекс присутствует в маске.
Ключом к этой функции является возможность определить, присутствует ли данный индекс в битовой карте. Для этого сначала нужно создать битовую маску для нужного индекса, а затем применить эту маску к битовой карте, чтобы проверить, установлено ли это значение.
По сути, мы хотим построить целое число, в котором установлен только один бит, а все остальные равны нулю. Затем мы можем поразрядно И эту маску с битовой картой и проверить, установлена ли конкретная позиция, сравнивая результат с 0.
Допустим, у нас есть 8-битная карта, подобная следующей:
map: 1 0 0 1 1 1 0 1
---------------
indexes: 7 6 5 4 3 2 1 0
Чтобы проверить значение для индекса 4, нам понадобится битовая маска, которая выглядит следующим образом:
mask: 0 0 0 1 0 0 0 0
---------------
indexes: 7 6 5 4 3 2 1 0
Чтобы построить маску, мы просто начинаем с 1 и сдвигаем ее на N:
1: 0 0 0 0 0 0 0 1
shift by 1: 0 0 0 0 0 0 1 0
shift by 2: 0 0 0 0 0 1 0 0
shift by 3: 0 0 0 0 1 0 0 0
shift by 4: 0 0 0 1 0 0 0 0
Получив это, мы можем применить маску к карте и посмотреть, установлено ли значение:
map: 1 0 0 1 1 1 0 1
mask: 0 0 0 1 0 0 0 0
---------------
result of AND: 0 0 0 1 0 0 0 0
Поскольку результат равен! = 0, мы можем сказать, что индекс 4 включен в карту.