Hello,
I'm working on Practical C Programming exercise 11-6 and have a solution. I just feel like it's kind of messy, so I wanted to see if others had feedback on a cleaner, easier way. Mind you, we haven't reach pointers yet in the book. Thanks!
Code:/************************************************************* pcp11_6 -- Takes the 1 bits in a number and shifts them to the left end. *************************************************************/ #include <stdio.h> char line[100]; /* user input */ unsigned char num; /* number from user input (8-bit)*/ int ones_count; /* number of 1s to shift */ unsigned char new_num; /* new number with shifted bits */ int i,j; /* counters */ int k; /* bit shift counter */ int main(void) { //initialize vars ones_count = 0; k = 7; // Get user input and store in integer printf("Please enter a number (1 to 255): "); fgets(line, sizeof(line), stdin); sscanf(line, "%d", &num); // Count number of 1s in the 8-bit number for(i = 0x80; i > 0; i = (i >> 1)) { if(num & i) { ++ones_count; } } // Create new number, bit-by-bit for(i = 0x80; i > 0; i = (i >> 1)) { // Push all of the 1s to the left side of the new number while(ones_count != 0) { new_num |= 1 << k; i = i >> 1; --ones_count; --k; } // Fill in the rest of the number with 0s new_num |= 0 << k; --k; } printf("\nNew number is = %d.\n", new_num); return 0; }



4Likes
LinkBack URL
About LinkBacks



. You will probably want to throw that out and try something from our