int main (int argc, char **argv) { char **population; //include every parent that is about to have childen //long long type can represent upto 20 bits of 1 and 0, //chroms longer than 20bits will be splited to array of long long numbers char chrom1[] = "10101010001101011"; char chrom2[] = "11010000110010010"; int length = sizeof(chrom1)-1; double crossover = (double)0.5; //this determines the crossover point in chrom //generate mask for crossover char *mask1 = (char *) malloc(length*sizeof(char)); char *mask2 = (char *) malloc(length*sizeof(char)); generate_mask(mask1, mask2, length, crossover); printf("input 1: %15s (%d) 2: %15s (%d) Length: %d\n", chrom1, fitness(chrom1,length), chrom2, fitness(chrom2, length), length); printf("masks 1: %15s 2: %15s\n", mask1, mask2); char *ptr1,*ptr2; //convert the above 4 string values to decimal int following binary rule. long long ret1 = strtoul(chrom1, &ptr1, 2); long long ret2 = strtoul(chrom2, &ptr2, 2); long long m1 = strtoul(mask1, &ptr1, 2); long long m2 = strtoul(mask2, &ptr2, 2); //crossover operation long long ichild1 = (ret1 & m2) ^ (ret2 & m1); long long ichild2 = (ret1 & m1) ^ (ret2 & m2); //convert binary format childern to string, in order to add them to parent pool. char *child1 = (char *)malloc(length * sizeof(char)); char *child2 = (char *)malloc(length * sizeof(char)); sprintf(child1,"%lld",int_to_binary(ichild1)); sprintf(child2,"%lld",int_to_binary(ichild2)); printf("child 1: %18s 2: %s",child1,child2); return 0; }
int main() { float f_num; int i_num; unsigned int ui_num; int i, N; scanf("%d", &N); while (N--) { scanf("%f", &f_num); i_num = (int)f_num; ui_num = (unsigned int)abs(i_num); printf("float: %f | int: %d | unsigned int: %d\n\n", f_num, i_num, ui_num); printf("float->binary: %s\n", float_to_binary(f_num)); printf("integer->binary: %s\n", int_to_binary(i_num)); printf("(simple)integer->binary: %s\n", simple_int_to_binary(i_num)); printf("unsigned integer->binary: %s\n", unsigned_int_to_binary(ui_num)); } return 0; }
int B() { const int SIZE = 4096; const char *name = "OS"; int shm_fd; void *ptr; int i,result; static int binary[1000]; static int ten[1000]; static int count[1000]; static int index=0; // read from SM and convert to bunary shm_fd = shm_open(name, O_RDONLY,0666); if(shm_fd == -1){ printf("shared memory failed\n"); exit(-1); } ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); if(ptr == MAP_FAILED){ printf("Map Failed\n"); exit(-1); } i = atoi(ptr); if(i==-1){ //取最大輸出 int max = 0; for(int b=0;b<index;b++){ if(count[b]>max){ max=count[b]; } } shm_fd = shm_open(name, O_CREAT|O_RDWR,0666); ftruncate(shm_fd, SIZE); ptr = mmap(0, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0); if(ptr == MAP_FAILED){ printf("Map Failed\n"); return -1; } for(int c=0;c<index;c++){ if(count[c]==max){ sprintf(ptr,"%d:%d;",ten[c],binary[c]); ptr+=strlen(ptr); } } }else if(i==-2){ //取最小輸出 int min=count[0]; for(int j=1;j<index-1;j++){ if(min>count[j]){ min=count[j]; } } shm_fd = shm_open(name, O_CREAT|O_RDWR,0666); ftruncate(shm_fd, SIZE); ptr = mmap(0, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0); if(ptr == MAP_FAILED){ printf("Map Failed\n"); return -1; } for(int g=0;g<index-1;g++){ if(count[g]==min){ sprintf(ptr,"%d:%d;",ten[g],binary[g]); ptr+=strlen(ptr); } } } else{ result= int_to_binary(i); //write result back to SM shm_fd = shm_open(name, O_CREAT|O_RDWR,0666); ftruncate(shm_fd, SIZE); ptr = mmap(0, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0); if(ptr == MAP_FAILED){ printf("Map Failed\n"); return -1; } sprintf(ptr,"%d:%d;",i,result); //store all int and binary ten[index]=i; binary[index]=result; //store the binary to string (for compare later) count[index] = count1s(i); index++; } return 0; }
int int_to_binary(int k) { if (k == 0) return 0; if (k == 1) return 1; /* optional */ return (k % 2) + 10 * int_to_binary(k / 2); }
//convert decimal int to binary format int which is represented in a decimal format. //only for display, cannot be used for computing. unsigned long long int_to_binary(unsigned long long k) { return (k == 0 || k == 1 ? k : ((k % 2) + 10 * int_to_binary(k / 2))); }