Bitfolge umdrehen



  • Hallo zusammen,

    ich habe eine kleine Anwendung die eine Zahl einliest, bitweise umdreht und dann als Zahl wieder ausgibt.
    Ich würde nun gerne wissen, ob es nur mit C/C++ geht und ohne bitset<> oder anders gesagt: Wie kann man es effizienter und prägnanter schreiben. Wichtig ist übrigens, dass beim Umdrehen die die führenden 0 entfernt werden da sonst falsche Zahlen rauskommen.

    #include <bitset>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int inint = 0;
        cin >> inint;
    
        bitset<32> inbit (inint);
        bitset<32> outbit(0);
    
        int counter;
        int outindex;
        for(counter = 31, outindex = 0; counter > -1; counter--, outindex++)
        {
            outbit[outindex] = inbit[counter];
        }
    
        for(counter = 31; counter > -1; counter--)
        {
            if(inbit[counter])
            {
                outbit >>= 31 - counter;
                break;
            }
        }
    
        cout << outbit.to_ulong();
    
        cin >> inint;
        return 0;
    }
    


  • http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious

    Wichtig ist übrigens, dass beim Umdrehen die die führenden 0 entfernt werden da sonst falsche Zahlen rauskommen.

    Beispiel?



  • Beispiele:

    1.)
    Input
    47
    00000000000000000000000000101111

    Output
    61
    00000000000000000000000000111101

    ---------------------------------------
    2.)
    Input
    13
    00000000000000000000000000001101

    Output
    11
    00000000000000000000000000001011



  • Ohne bitset:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	int in;
    	unsigned int einBit = 1 << 31;
    
    	cin >> in;
    
    	while(einBit && !(einBit & in)) //Führende Nullen überlesen
    		einBit >>= 1;
    
    	const int pos = einBit;  //an dieser Position einschieben
    	int out = 0;
    
    	while(einBit)
    	{
    		int bit = einBit & in ? 1 : 0; //Bit gesetzt?
    
    		out >>= 1;
    
    		if(bit)
    			out |= pos;
    
    		einBit >>= 1;
    	}
    
    	cout << out;
    }
    


  • Also du willst Bits ab der ersten gesetzten 1 umdrehen? Das halte ich nicht fuer gut, da ein reverse(reverse(2)) != 2 ist.



  • Ohne soviel Code:

    #include <iostream>
    
    int bit_reverse( int x )
    {
        int result = 0;
        for( ; x > 0; x >>= 1 )
            (result <<= 1) |= (x & 1);
        return result;
    }
    
    int main()
    {
        using namespace std;
        for( int zahl; cout << "\nInput: ", cin >> zahl; )
            cout << "Output: " << bit_reverse( zahl ) << endl;
        return 0;
    }
    

Log in to reply