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.


Anmelden zum Antworten