2015-12-31 2 views
0

Je transfère du code écrit en Java vers C11. Le code Java utilise BitSet pour retourner les bits d'un vecteur. Je sais qu'il y a BitSet correspondant pour C++, mais je ne suis pas sûr s'il y a quelque chose de similaire disponible pour c11. Je dois utiliser c11 par exigences. Je ne suis pas très familier avec le nouvel ensemble de fonctions dans C11, comme la plupart de mon code précédent ont été soit en ANSI-C ou C99.Prise en charge de BitSet en c11

Est-ce que quelque chose comme ceci est disponible en C (C11) ou ai-je besoin d'écrire ma propre fonction qui mappe à un groupe de mémoire, puis utilise des opérateurs de bits?

+3

Je vais supprimer la balise Java, car cette question ne concerne pas vraiment Java (sauf l'utilisation d'une classe Java comme raccourci pour décrire le comportement souhaité). Mais s'il vous plaît noter que les questions demandant des outils ou des bibliothèques [sont hors sujet pour Stack Overflow] (http://stackoverflow.com/help/on-topic), donc cette question peut être fermée de toute façon. – yshavit

+0

Quel est le problème avec simple 'OR'ing /' AND'ing ?? –

+0

La question en double répond plus ou moins à la question, alors merci de le signaler. La question fondamentale est différente cependant, comme je demande si C11 a le support pour BitSit ou pas, pas comment implémenter. Je ne demande pas spécifiquement comment l'implémenter, je ne demande pas non plus de bibliothèques; C'est une question de langage C11. Est-ce hors sujet? – Andy

Répondre

2

Il n'y a pas de BitSet, en soi, dans C (C11 ou autre). C a un accès direct à la mémoire, vous pouvez donc utiliser directement les types de données. Par exemple, un bit de 8 bits peut être créé avec uint8_t comme suit.

Utilisation

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) 

En savoir plus sur les opérateurs au niveau du bit https://en.wikipedia.org/wiki/Bitwise_operations_in_C

+0

Si vous voulez le rendre plus complet, retourner les bits individuels serait fait par 'xor'ing avec' 1' ... BTW, désengager les bits ne fonctionnera pas de cette façon ... Il devrait être 'bitset & ~ (1 << 3) '. Quoi qu'il en soit, édité pour vous .. –

+0

Merci! J'essayais de me rappeler comment retourner des morceaux individuels. Et bonne prise .. Bitshifting 0 n'a aucun sens. – AlexPogue

+0

Merci pour la réponse! Comme les vecteurs ont au moins un millier de bits, je vais utiliser la méthode décrite dans la réponse liée. Désolé de manquer cela lors de la recherche d'une réponse. – Andy

0

En ce qui me concerne, pas de telles fonctions existent dans la bibliothèque standard C. Tu dois l'écrire toi-même. Heureusement, un bitet est l'une des structures de données les plus faciles à implémenter.