#include <stdio.h>
typedef int value_t;
void SWAP(value_t* a, value_t* b) {
value_t t = *a;
*a = *b; *b = t;
}
int next_index(int n)
{
while (n & 1) { n = n >> 1; }
return n >> 1;
}
void interleave(value_t A[], int n)
{
int i, j, k;
int m = n/2;
value_t* L = A;
value_t* R = A+m;
// Place 1st half
for (i=1; i < m; i++) {
j = next_index(i);
SWAP( L+i, R+j);
}
//unscramble step
for (j=0;j < m/2 -1; j++) {
k = next_index(m/2 + j);
while (k < j) {
k = next_index(m/2 + k);
}
SWAP( R+j, R+k);
}
if (n-m > 1) {
int b = !(m&1) ? 1 : 0;
interleave(R+b, n-m-b);
}
}
value_t A[100];
int main(void) {
int i;
int count = 20;
for (i=0;i<count; i++) {
A[i]=i;
}
interleave(A, count);
for (i=0;i<count; i++) {
}
}