Задачи на работу с отдельными битами

В задачах множество чисел в интервале 0≤x≤65535=216 представлено последовательностью битов (двоичных разрядов), содержащихся в массиве байтов:

    unsigned char bitset[8192]; // 8192 == 65536/8
Биты в этом массиве нумеруются с нуля, внутри каждого байта — от младшего к старшему: младший бит, т.е. число 1, имеет номер 0, старший бит (число 128) имеет номер 7. Нумерация продолжается от байта к байту.

Число x принадлежит множеству тогда и только тогда, когда бит с номером x равен единице.

Последовательность битов записывается в файл (текстовый или бинарный — как вам больше нравится) в виде последовательности целых чисел в диапазоне 0..255 (в десятичном или 16-ричном виде, на выбор), каждое из них представляет один байт.

Список задач

  1. Инвертировать последовательность битов. Длина последовательности 65536 битов (8192 байтов).
  2. Найти симметрическую разность двух множеств (объединение минус пересечение). Каждое из множеств представлено последовательностью битов, длина последовательности 65536 битов (8192 байтов).
  3. Из первого множества вычесть второе. Каждое из множеств представлено последовательностью битов, длина последовательности 65536 битов (8192 байтов).
  4. Найти число связных подпоследовательностей, состоящих из единиц, в последовательности битов. Длина последовательности 65536 битов (8192 байтов).
  5. Найти число вхождений 4-битового образца, представленного небольшим числом 0≤x≤15, в последовательность битов. Длина последовательности 65536 битов (8192 байтов).
  6. Записать в файл последовательность небольших чисел 0≤xi≤15, i=0, 1, 2, ..., n-1, используя по 4 бита для записи каждого числа. Число n четное.