2014-12-21 4 views
0

Я искал лучшее решение проблемы MAXCOUNT и нашел несколько строк, которые я не понял.Каково значение этих #defines?

Codechef Problem и Best Solution submitted

Пока я читал код, чтобы наблюдать подход, я столкнулся эти строки в верхней части кода:

#define isSet(n) flags[n>>5]&(1<<(n&31)) 
#define unset(n) flags[n>>5] &= ~(1<<(n&31)) 
#define set(n) flags[n>>5]|=(1<<(n&31)) 

Я понятия не имею, что такое значение используя эти строки.
Может кто-нибудь объяснить эти строки и почему они используются?

+1

Поиск "C макросов" – HamZa

+0

BTW: Это не отличные макросы. При минимальном значении '(1 << (n & 31))' должно обеспечивать беззнаковое арифметическое, например: '(1u << (n & 31))'. Кроме того, константа 31 основана на предположениях диапазона «n». – chux

ответ

3

Похоже, что это относится к массиву бит, хранящихся как целые числа. n >> 5 означает разделить его на 32, а в int есть 32 бита, чтобы индексировать массив. Тогда правая часть использует остаток (битовая диаграмма 31 равна 0b11111, что означает, что операция с ней будет отфильтровывать все остальные биты, оставив только пять наименее значимых - что будет соответствовать остатку после деления на 32), чтобы найти конкретный бит, который интересует (1 < < n делает однобитовую маску в положении n, а оператор & отфильтровывает все, кроме этого).

Unset uses ~, который инвертирует маску - очищает бит, оставляя остальное то же самое. set использует поразрядный или оператор, который устанавливает один бит.

Так что это просто удобные макросы для работы с отдельными битами в массиве целых чисел.

+0

Хороший ответ. Возможно, вы могли бы добавить, что битовый шаблон 31 равен '0b11111', поэтому' n & 31' возвращает пять наименее значимых бит 'n'. – 5gon12eder

+0

Да, действительно, я добавлю это. Как правило, любая сила двух - это один бит. Сила в два минус одна - это все биты справа от нее. Это красиво случается, чтобы соответствовать остатку, если вы разделили эту силу на две (подобно тому, как в десятичных числах, если вы разделите на десять, остаток будет последней цифрой справа). В общем случае не верно, что & и остатки одинаковы, но в этом случае это хорошо, когда мы работаем с битами, такими как автор. –