Wie implementiere ich ein Bitset in C?

8

Ich habe die Klasse Bitset in Java und I verwendet würde gerne etwas Ähnliches in C machen. Ich nehme an, dass ich es manuell machen müsste, wie die meisten Sachen in C. Was wäre eine effiziente Art zu implementieren?

%Vor%

vielleicht

%Vor%

?

    
David Robles 07.12.2010, 01:07
quelle

7 Antworten

13
___ answer21001661 ___

Niemand hat erwähnt, was die C FAQ empfiehlt, nämlich eine Reihe von guten alten Makros:

%Vor%

(über Zypern )

    
___ qstntxt ___

Ich habe die Klasse Bitset in Java und I verwendet würde gerne etwas Ähnliches in C machen. Ich nehme an, dass ich es manuell machen müsste, wie die meisten Sachen in C. Was wäre eine effiziente Art zu implementieren?

%Vor%

vielleicht

%Vor%

?

    
___ antwort4372519 ___

CCAN verfügt über eine Bitset-Implementierung, die Sie verwenden können: Ссылка

Aber wenn Sie es am Ende selbst implementieren (zum Beispiel, wenn Sie die Abhängigkeiten für dieses Paket nicht mögen), sollten Sie ein Array von Ints verwenden und die native Größe der Computerarchitektur verwenden:

%Vor%

Verwenden Sie keine bestimmte Größe (z. B. mit uint64 oder uint32), lassen Sie den Computer verwenden, was er verwenden möchte, und passen Sie ihn mithilfe von sizeof an.

    
___ answer24892676 ___

Ich empfehle meine BITSCAN C ++ - Bibliothek (Version 1.0 wurde gerade veröffentlicht). BITSCAN ist speziell auf schnelle Bit-Scan-Operationen ausgerichtet. Ich habe es verwendet, um NP-Hard-kombinatorische Probleme zu implementieren, die einfache ungerichtete Graphen wie die maximale Clique beinhalten (siehe BBMC Algorithmus, für einen führenden genauen Löser).

Ein Vergleich zwischen BITSCAN und den Standardlösungen STL bitset und BOOST dynamic_bitset finden Sie hier: Ссылка

    
___ answer4372561 ___

Wie immer müssen Sie zuerst entscheiden, welche Art von Operationen Sie auf Ihrem Bitset ausführen müssen. Vielleicht eine Teilmenge von dem, was Java definiert? Danach können Sie entscheiden, wie Sie es am besten implementieren. Sie können sicherlich die Quelle für BitSet.java in OpenJDK nach Ideen suchen.

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer23542596 ___

Sie können meinen Code PackedArray mit einem %code% von %code% ausprobieren.

Es implementiert einen Random-Access-Container, in dem Elemente auf der Bit-Ebene gepackt werden. Mit anderen Worten, es verhält sich so, als ob Sie in der Lage wären, z.B. %code% oder %code% array:

%Vor%     
___ answer4372530 ___

Machen Sie es zu einem Array von unsigned int 64.

    
___ tag123bitset ___ Ein Bit-Array (auch bekannt als Bitmap, Bitset oder Bitstring) ist eine Array-Datenstruktur, die einzelne Bits (boolesche Werte) kompakt speichert. ___ qstnhdr ___ Wie implementiere ich ein Bitset in C? ___ antwort4372521 ___

Nun, Byte-Bitset [] scheint ein wenig irreführend, nein?

Verwenden Sie Bitfelder in einer Struktur und dann können Sie eine Sammlung dieser Typen verwalten (oder sie anderweitig verwenden, wie Sie es für richtig halten)

%Vor%     
___
Mike Axiak 07.12.2010, 01:09
quelle
8

Niemand hat erwähnt, was die C FAQ empfiehlt, nämlich eine Reihe von guten alten Makros:

%Vor%

(über Zypern )

    
user755921 08.01.2014 16:48
quelle
3
___ answer21001661 ___

Niemand hat erwähnt, was die C FAQ empfiehlt, nämlich eine Reihe von guten alten Makros:

%Vor%

(über Zypern )

    
___ qstntxt ___

Ich habe die Klasse Bitset in Java und I verwendet würde gerne etwas Ähnliches in C machen. Ich nehme an, dass ich es manuell machen müsste, wie die meisten Sachen in C. Was wäre eine effiziente Art zu implementieren?

%Vor%

vielleicht

%Vor%

?

    
___ antwort4372519 ___

CCAN verfügt über eine Bitset-Implementierung, die Sie verwenden können: Ссылка

Aber wenn Sie es am Ende selbst implementieren (zum Beispiel, wenn Sie die Abhängigkeiten für dieses Paket nicht mögen), sollten Sie ein Array von Ints verwenden und die native Größe der Computerarchitektur verwenden:

%Vor%

Verwenden Sie keine bestimmte Größe (z. B. mit uint64 oder uint32), lassen Sie den Computer verwenden, was er verwenden möchte, und passen Sie ihn mithilfe von sizeof an.

    
___ answer24892676 ___

Ich empfehle meine BITSCAN C ++ - Bibliothek (Version 1.0 wurde gerade veröffentlicht). BITSCAN ist speziell auf schnelle Bit-Scan-Operationen ausgerichtet. Ich habe es verwendet, um NP-Hard-kombinatorische Probleme zu implementieren, die einfache ungerichtete Graphen wie die maximale Clique beinhalten (siehe BBMC Algorithmus, für einen führenden genauen Löser).

Ein Vergleich zwischen BITSCAN und den Standardlösungen STL bitset und BOOST dynamic_bitset finden Sie hier: Ссылка

    
___ answer4372561 ___

Wie immer müssen Sie zuerst entscheiden, welche Art von Operationen Sie auf Ihrem Bitset ausführen müssen. Vielleicht eine Teilmenge von dem, was Java definiert? Danach können Sie entscheiden, wie Sie es am besten implementieren. Sie können sicherlich die Quelle für BitSet.java in OpenJDK nach Ideen suchen.

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer23542596 ___

Sie können meinen Code PackedArray mit einem %code% von %code% ausprobieren.

Es implementiert einen Random-Access-Container, in dem Elemente auf der Bit-Ebene gepackt werden. Mit anderen Worten, es verhält sich so, als ob Sie in der Lage wären, z.B. %code% oder %code% array:

%Vor%     
___ answer4372530 ___

Machen Sie es zu einem Array von unsigned int 64.

    
___ tag123bitset ___ Ein Bit-Array (auch bekannt als Bitmap, Bitset oder Bitstring) ist eine Array-Datenstruktur, die einzelne Bits (boolesche Werte) kompakt speichert. ___ qstnhdr ___ Wie implementiere ich ein Bitset in C? ___ antwort4372521 ___

Nun, Byte-Bitset [] scheint ein wenig irreführend, nein?

Verwenden Sie Bitfelder in einer Struktur und dann können Sie eine Sammlung dieser Typen verwalten (oder sie anderweitig verwenden, wie Sie es für richtig halten)

%Vor%     
___
Ed S. 07.12.2010 01:09
quelle
2

Ich empfehle meine BITSCAN C ++ - Bibliothek (Version 1.0 wurde gerade veröffentlicht). BITSCAN ist speziell auf schnelle Bit-Scan-Operationen ausgerichtet. Ich habe es verwendet, um NP-Hard-kombinatorische Probleme zu implementieren, die einfache ungerichtete Graphen wie die maximale Clique beinhalten (siehe BBMC Algorithmus, für einen führenden genauen Löser).

Ein Vergleich zwischen BITSCAN und den Standardlösungen STL bitset und BOOST dynamic_bitset finden Sie hier: Ссылка

    
chesslover 22.07.2014 16:20
quelle
1

Sie können meinen Code PackedArray mit einem bitsPerItem von 1 ausprobieren.

Es implementiert einen Random-Access-Container, in dem Elemente auf der Bit-Ebene gepackt werden. Mit anderen Worten, es verhält sich so, als ob Sie in der Lage wären, z.B. uint9_t oder uint17_t array:

%Vor%     
Gregory Pakosz 08.05.2014 13:04
quelle
0

Wie immer müssen Sie zuerst entscheiden, welche Art von Operationen Sie auf Ihrem Bitset ausführen müssen. Vielleicht eine Teilmenge von dem, was Java definiert? Danach können Sie entscheiden, wie Sie es am besten implementieren. Sie können sicherlich die Quelle für BitSet.java in OpenJDK nach Ideen suchen.

    
James K Polk 07.12.2010 01:18
quelle
-2

Machen Sie es zu einem Array von unsigned int 64.

    
EvilTeach 07.12.2010 01:11
quelle

Tags und Links