Bit fields are one of the most important aspects of embedded programming . Let us see few tricky and interesting cases in that field ..
1. Searching for the no of bits set in a given number
-- Let us see with an example how we can check for the no of bits set in a number
#include<stdio.h> #include<sys/time.h> #include<string.h> #include<time.h> char *time_stamp() { static char buf[100]; char timestamp[100]; time_t time; struct timeval detail_time; memset (buf, 0, 100); gettimeofday(&detail_time,NULL); time = detail_time.tv_sec; strftime(timestamp, 100, "%Y/%m/%d %H:%M:%S", localtime(&time)); sprintf(buf, "%s:%ld:%ld ", timestamp, detail_time.tv_usec /1000, detail_time.tv_usec%1000); return buf; } int main() { int test ; int temp,i=0; char bits_count= 0; printf("Enter any number \n"); scanf("%d",&test); temp =test; printf("Time stamp 1 is %s \n",time_stamp()); /* Method -1 */ do { if(temp & 1) bits_count++; temp = temp >>1; }while((i++)<(sizeof(int)*8)); printf("No_of_bits_set are %d\n",bits_count); printf("Time stamp 2 is %s \n",time_stamp()); bits_count= 0; temp =test; /* Method - 2*/ while(temp) { if(temp & 1) bits_count++; temp =temp >>1; }; printf("No_of_bits_set are %d\n",bits_count); printf("Time stamp 3 is %s \n",time_stamp()); /*Method -3 */ bits_count= 0; temp =test; while(temp) { if(!((char)temp & 0xff)) temp = temp >> 8; else if(temp & 1) bits_count++; temp =temp >>1; }; printf("No_of_bits_set are %d\n",bits_count); printf("Time stamp 4 is %s \n",time_stamp()); return 0 ; }Enter any number 32 <<< one of the worst case scenarios ! Time stamp 1 is 2012/11/02 23:32:47:413:450 No_of_bits_set are 1 Time stamp 2 is 2012/11/02 23:32:47:413:774 <<<< approx 300 Micro seconds No_of_bits_set are 1 Time stamp 3 is 2012/11/02 23:32:47:413:809 <<<< approx 35 Micro seconds No_of_bits_set are 1 Time stamp 4 is 2012/11/02 23:32:47:413:832 <<< approx 23 Micros !!!! :-) << similarly can be calculated for other number as well .... Enter any number 65535 Time stamp 1 is 2012/11/02 23:33:10:851:616 No_of_bits_set are 16 Time stamp 2 is 2012/11/02 23:33:10:851:973 No_of_bits_set are 16 Time stamp 3 is 2012/11/02 23:33:10:852:8 No_of_bits_set are 16 Time stamp 4 is 2012/11/02 23:33:10:852:31