//gcc -Wall bit_nummer.c -o bit_nummer #include #include /* 00000000011101001111000000111000 7663672 N 11111111100010110000111111001000 -7663672 -N 00000000000000000000000000001000 8 c=N & -N 00000000011101001111000001000000 7663680 r=N + (N & -N) 00000000000000000000000001111000 :r^N 00000000000000000000000000011110 :((r^N) >> 2) 00000000000000000000000000000011 :(((r^N) >> 2) / c) 00000000011101001111000001000011 :(((r^N) >> 2) / c)|r * c = N & -N; // Erste 1. Um wie viele Stellen muss nach rechts verschoben werden * r = N + (N & -N); // Naechst groessere Zahl * ((r^N) >> 2) // Wie viele 1en fehlen jetzt? * (((r^N) >> 2)/c) // Die fehlenden 1en auf die letzen Stellen setzen * (((r^N) >> 2)/c)|r // Die naechst groessere Zahl mit gleich vielen 1en. */ long int get_next_number( long int N ) { long int c = N & -N; long int r = N+c; return (((r^N) >> 2) / c) | r; } int main( int argc, char **argv ) { long int number; printf("Geben Sie eine Zahl ein (>0):\t"); if( (scanf( "%ld",&number ) != 1) || (number <= 0) ) { return 1; } printf("%ld\n", get_next_number(number) ); return 0; }