«

»

Mar 01

Back to pure C – bits hacks

ООП, паттерны, MVC…  Программирование эволюционирует семимильными шагами – если пять лет назад на собеседованиях модно было спрашивать про виртуальные конструкторы да множественное наследование в C++, то теперь разговор с кандидатом частенько переходит в околофилософское русло с обсуждением преимуществ тех или иных парадигм программирования или обоснованием порочности безоглядного применения паттернов. И как то подзабывается то, с чего все начиналось – операции с битиками, безжалостная борьба за память…

А тут, внезапно, спонадобилось мне поработать с битами в инте – в условиях дефицита памяти оставлять аж четыре байта бесхозными рука не поднималась. 32 разряда (на большинстве платформ) дают возможность хранить и передавать более чем достаточное количество характеристик-флагов. Мне же спонадобилось определять содержит ли конкретный (по счету) бит единичку или нет?

Для этого можно написать нехитрый макрос, проверяющий содержит ли бит с номером position_number единичку в числе int_to_check.

#define IS_BIT_SET(int_to_check, position_number) ( ( int_to_check ) & ( 1 << position_number ) )

А использовать как-то так:

if ( IS_BIT_SET(some_int, position_number) ) {
//TODO: perform some action here
}

Только не стоит забывать, что position_number не должен превышать разрядность типа и нумерация битов начинается с нуля.

В C++ для подобных целей логично использовать специальный встроенный тип: std::bitset.

PS. Дада, не всегда в инте 4 байта, на некоторых платформах имеет смысл отталкиваться от порядка байтов

PPS. Поддавшись влиянию ностальгии по временам настоящих компутеров не могу удержаться от ссылки на прелюбопытную подборку снипетов для работы с битами: http://graphics.stanford.edu/~seander/bithacks.html. Приравние друг-дружке двух чисел без дополнительных переменных, изменение порядка битов в байтах, деление чисел без операции деление, вычисление модуля числа и прочие трюки, которые полезно знать любому, утверждающему что он знает Си.

1 comment

  1. Larry

    Keep it coimng, writers, this is good stuff.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>