spezielles Bitmask-Problem
-
Hallo zusammen,
ich habe ein möglicherweise etwas ungewöhnliches Bitmask-Problem. Vielleicht ist es auch ganz einfach und ich mache es mir zu kompliziert?Und zwar habe ich eine 16 oder 32 Bit breite Zahl, deren unteren x Zahlen = 0 sein sollen. Also z.B. eine short-Zahl, deren unteren 5 Bit 0 sein sollen. Der Wert der restlichen 11 Bit sind dagegen egal, können also 0 oder 1 sein. Es sollen nur die Zahlen ausgefiltert werden, deren unteren 5 Bit gleich 0 sind. Wie kann man das ausdrücken? Zuerst nach 1 filtern, also 0x001F und dann diesen Wert mit dem Komplement ~ umdrehen? Dachte ich geht aber so nicht. Wer kann mir da weiterhelfen?
Vielen Dank
Gruss Christian
-
Hast du erst mit 0x001F verundet und dann invertiert oder erst 0x001F invertiert und dann verundet?
-
Ich habe die Frage nach mehrmaligem durchlesen nicht verstanden. Kannst du das nochmal schildern was du genau willst? Ich ahne, dass sich dein Problem dann von selbst löst.
-
Die unteren 5 Bit sollen nicht gesetzt sein, die restlichen Bits spielen keine Rolle.
Ich habe die zuerst die Bitmask invertiert und dann mit den gesuchten Zahlen verundet.Gruss Christian
-
du willst die niederwertigsten 5 bits auf 0 setzen?
das sollte doch mit 2 bitshifts zu machen sein.
-
Big Brother the genuine schrieb:
du willst die niederwertigsten 5 bits auf 0 setzen?
das sollte doch mit 2 bitshifts zu machen sein.Nein, keine Werte manipulieren sondern Variablen ausfiltern, bei denen die unteren 5 Bits nicht gesetzt sind.
-
columbus schrieb:
Nein, keine Werte manipulieren sondern Variablen ausfiltern, bei denen die unteren 5 Bits nicht gesetzt sind.
Hier mal mein Vorschlag:
#include <stdlib.h> #include <stdio.h> int main( void ) { short i; char bin[36]; for (i=0; i<=0xFF; ++i) { if ((i&0x1F) == 0) // alternativ: if ((i&(~0x1F)) == i) { itoa (i,bin,2); printf ("%016s\n",bin); } } return 0; }
viele grüße
ralph
-
ah! so langsam geht ein lichtlein auf ...
na dann setze alle bits oberhalb des 5 null und guck ob 0 rauskommt.
-
int lower5bit_zero ( unsigned number ) { return 0 == number & 0x1f; // 1: si, 0: no }
iwie so in erster näherung...
-
columbus schrieb:
Ich habe die zuerst die Bitmask invertiert und dann mit den gesuchten Zahlen verundet.
Die Invertierung ist in diesem Fall nicht nötig.