поддержка BitSet в c11

Я переношу некоторый код, написанный на Java, на C11. Код Java использует BitSet для перестановки битов в векторе. Я знаю, что для c++ существует соответствующий BitSet, но я не уверен, что для c11 доступно что-то подобное. Я должен использовать c11 в соответствии с требованиями. Я не слишком хорошо знаком с новым набором функций в c11, так как большая часть моего предыдущего кода была написана либо на ANSI-C, либо на C99.

Есть ли что-то подобное в C (C11) или мне нужно написать свою собственную функцию, которая сопоставляется с группой памяти, а затем использует битовые операторы?


person Andy    schedule 31.12.2015    source источник
comment
Я собираюсь удалить тег Java, поскольку этот вопрос на самом деле не имеет отношения к Java (кроме использования класса Java в качестве сокращения для описания желаемого поведения). Но обратите внимание, что вопросы об инструментах или библиотеках не относятся к теме переполнения стека, поэтому этот вопрос в любом случае может быть закрыт.   -  person yshavit    schedule 31.12.2015
comment
Что не так с простым ORing/ANDing??   -  person Eugene Sh.    schedule 31.12.2015
comment
Повторяющийся вопрос более или менее отвечает на вопрос, поэтому спасибо, что указали на это. Однако основной вопрос в другом, поскольку я спрашиваю, поддерживает ли C11 BitSit или нет, а не как это реализовать. Я не спрашиваю конкретно, как это реализовать, и не прошу библиотеки; это вопрос языка C11. Это не по теме?   -  person Andy    schedule 01.01.2016


Ответы (2)


В C (C11 или где-то еще) BitSet как такового нет. C имеет прямой доступ к памяти, поэтому вы можете просто использовать типы данных напрямую. Например, битовый набор из 8 бит может быть создан с помощью uint8_t следующим образом.

Использование

uint8_t bitset = 0;
bitset = bitset | (1 << 4); // set 4th bit, like BitSet.set(4)
bitset = bitset & ~(1 << 3); // unset 3rd bit, like BitSet.clear(3)
bitset = ~bitset; // flip the bits, like BitSet.flip(0, 7)
bitset = bitset ^ (1 << 4); // flip the 4'th bit like BitSet.flip(4)

Подробнее о побитовых операторах читайте на странице https://en.wikipedia.org/wiki/Bitwise_operations_in_C.

person AlexPogue    schedule 31.12.2015
comment
Если вы хотите сделать его более полным, переключение отдельных битов будет выполнено с помощью xor с 1... Кстати, сброс битов не будет работать таким образом... Должно быть bitset & ~(1 << 3). Во всяком случае, отредактировал это для вас .. - person Eugene Sh.; 31.12.2015
comment
Спасибо! Я пытался вспомнить, как переворачивать отдельные биты. И хороший улов .. Битовый сдвиг 0 не имеет никакого смысла. - person AlexPogue; 31.12.2015
comment
Спасибо за ответ! Поскольку векторы имеют длину не менее тысячи бит, вместо этого я буду использовать метод, описанный в связанном ответе. Извините, что пропустил это при поиске ответа. - person Andy; 01.01.2016

Насколько я понимаю, в стандартной библиотеке C таких функций нет. Вы должны написать это сами. К счастью, набор битов — одна из самых простых структур данных для реализации.

person fuz    schedule 31.12.2015