Einzelne Bits aus einem Array herausholen
-
Das sollen wohl nur Beispielwerte sein.
-
pale dog schrieb:
return !!(array[bytepos] & (1<<bit));Ach herrje.
Soviel zum Thema lesbarer Code. Was spricht gegen ein 'bool(...)' oder, wenn man C-casts partout vermeiden will, halt ein 'static_cast' anstatt des kryptischen '!!'?
-
Gibt es eine Funktion wo ich einzelne Bits aus einem Integer auslesen kann?
Denn dann könnte ich mit zwei for- Schleifen arbeiten.
for(int n=0; n<Anzahl Zeichenketten; n+) { for(int i=0; i<anzahl bits; i++) { /*Funktion die Bits testet bei*/ bool BitWert = Array[n],i; //Oder wie diese Funktion dann geht. ;) } }
-
Hallo !
LSB ist bit_pos = 0 usw.
int GetBit( int number, int bit_pos ) { return ( number >> bit_pos ) & 1 ; }
-
Und nummer dann der wert der Bitposition? und das & 1 ist das ausmaskieren der anderen?
sry, bin nicht der Beste, mich in Codes reinzudenken.

aber danke für den Tip
-
Konrad Rudolph schrieb:
pale dog schrieb:
return !!(array[bytepos] & (1<<bit));Ach herrje.
Soviel zum Thema lesbarer Code. Was spricht gegen ein 'bool(...)' oder, wenn man C-casts partout vermeiden will, halt ein 'static_cast' anstatt des kryptischen '!!'?der code ist uralt, stammt noch aus der vor-bool zeit (sieht man ja schon an den kommentaren)

-
number ist die Zahl, in der du eine Bitposition abfragen willst.
Möchtest du z.B. von der Zahl 8 die Bitposition 3, dann ist der Aufruf:
GetBit( 8, 3 );GetBit liefert entweder 1 oder 0, kannst also für den Rückgabetyp auch bool anstatt int schreiben.
-
pale dog schrieb:
der code ist uralt, stammt noch aus der vor-bool zeit (sieht man ja schon an den kommentaren)

Und dann auch noch doppelt invertiert, kann man sich die beiden !! auch gleich sparen.

-
proggingmania schrieb:
pale dog schrieb:
der code ist uralt, stammt noch aus der vor-bool zeit (sieht man ja schon an den kommentaren)

Und dann auch noch doppelt invertiert, kann man sich die beiden !! auch gleich sparen.

nö, die machen die nullen und einsen

btw: wir sind doch hier im c++ forum, also nehmt: http://www.cppreference.com/cppbitset/index.html

-
pale dog schrieb:
nö, die machen die nullen und einsen

Ja, klar, doppelte Negierungen:
aus !!(0) wird 0 und aus !!(1) wird 1
kann man gleich die beiden !! weglassen
-
proggingmania schrieb:
pale dog schrieb:
nö, die machen die nullen und einsen

Ja, klar, doppelte Negierungen:
aus !!(0) wird 0 und aus !!(1) wird 1
kann man gleich die beiden !! weglassen
0 und 1 sind aber nicht die einzigen möglichen Werte hier! Genauer gesagt kann jede beliebige Zweierpotenz vorkommen und '!!' (bzw. ein Cast nach 'bool') sorgt dafür, dass diese Werte plattgemacht werden.
Also: Bei solchen "Beweisen" immer schön drauf achten, dass alle möglichen Fälle abgedeckt werden.

-
Konrad Rudolph schrieb:
0 und 1 sind aber nicht die einzigen möglichen Werte hier!
Also: Bei solchen "Beweisen" immer schön drauf achten, dass alle möglichen Fälle abgedeckt werden.
Ach, da wird ja nach links geshiftet, gar nicht gesehen

ist das umständlich
-
proggingmania schrieb:
ist das umständlich

gar nicht. die funktion ist toll! die kann jeden typ, arrays, etc. als zusammenhängende bitmap ansprechen (wobei bit 0 immer ganz links ist)
AnyObject x; int b39 = GetBit ((char*)&x, 39);
-
Muttieeeee
-

-
proggingmania schrieb:
Ach, da wird ja nach links geshiftet, gar nicht gesehen

ist das umständlich
Ja, nach links shiften und dann doppelt negieren ist in der Tat umständlich.
Shiften nach rechts und dann eine Abfrage gegen 1 bietet sich da eher an.