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
00000000000000000000000000101111Output
61
00000000000000000000000000111101---------------------------------------
2.)
Input
13
00000000000000000000000000001101Output
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; }