Tbh, when I came across the problem, even the time when I was writing the post I didn’t have realized there exists such a simple solution (so I will change the challenge level to beginner). Good job! Btw I was thinking the there should exist a simple solution for implementing the solution for different numerical types in more languages that it actually seems to.
In C, I found it really difficult to implement such this for the matter of a game. So even the poster couldn’t solve the full challenge But challenge can remain for anybody interested to.
This is the solution I came up with. I 'll call it Mergy-sorty cause it reminds me the Merge-sort
void print(int num) {
int i;
int mask = 1<<sizeof(int)*8-1;
for(i=1; i<=sizeof(int); i++){
printf("%u",num & mask ? 1 : 0);
if (i%4 == 0) printf(" ");
num = num<<1;
}
printf("\n");
}
int srl(int num, int sa) {
return (int)((unsigned int) num >> sa);
}
int reverse(int num, int size, int splits, int mask) {
int mask2, mask1;
if (size == splits) {
return num & mask;
} else if (splits == 0) {
splits = 2;
mask1 = -1<<(size/2);
mask2 = srl(-1, size/2);
/*
printf("mask1 : ");
print(mask1);
printf("mask2 : ");
print(mask2);
printf("num : ");
print(num);
printf("\n");
*/
return reverse((num<<(size/splits)) & mask1, size, splits, mask1) ^ reverse(srl(num, size/splits) & mask2, size, splits, mask2);
} else {
splits *= 2;
mask1 = (mask<<(size/splits)) & mask;
mask2 = srl(mask, size/splits) & mask;
/*
printf("mask1 : ");
print(mask1);
printf("mask2 : ");
print(mask2);
printf("num : ");
print(num);
printf("\n");
*/
return reverse((num<<(size/splits)) & mask1, size, splits, mask1) ^ reverse(srl(num, size/splits) & mask2, size, splits, mask2);
}
}
####Tip :
Out-comment the print statements to unveil the magic