同样是格雷码
偶也来献丑,同样是格雷码。
代码:
#define CODE_LENGTH 9
#define TABLE_SIZE ((1 << CODE_LENGTH) - 1)
unsigned int table[TABLE_SIZE] = {
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 7,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 8,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 7,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 9,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 7,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 8,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 7,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1
};
char name[32];
char serial[TABLE_SIZE + 1];
unsigned int calc_name
(
char name[32],
unsigned int code[CODE_LENGTH]
)
{
int name_length = strlen(name);
int factor = 0x13572468;
int tmp1, tmp2;
unsigned char c;
int i;
for (i = 0; i < name_length; i++)
{
tmp1 = name[i];
tmp1 += factor;
tmp1 *= 0x03721273;
tmp1 += 0x24681357;
tmp2 = tmp1;
tmp2 <<= 0x19;
tmp1 >>= 0x07;
tmp2 |= tmp1;
factor = tmp2;
}
for (i = 1; i < CODE_LENGTH; i++)
{
tmp1= factor;
tmp1 = tmp1 >> i;
c = (unsigned char)tmp1;
c &= 0x01;
code[i - 1] = c;
}
code[8] = 1;
return (unsigned int)factor;
}
void calc_code1
(
int * a,
int * b
)
{
int i = CODE_LENGTH;
a += (CODE_LENGTH - 1);
b += (CODE_LENGTH - 1);
*b = *a;
for (i--; i > 0; i--, a--, b--)
{
*(b - 1) = (*b) ^ (*(a - 1));
}
}
int calc_code2
(
int * a
)
{
int v = 0;
int i;
i = CODE_LENGTH;
a += (CODE_LENGTH - 1);
for (; i > 0; i--, a--)
{
v = (v << 1) + (*a);
}
return v;
}
int calc(char input[32])
{
int serial_length = 0;
unsigned int name_int = 0;
unsigned int name_code[CODE_LENGTH] = {0};
int tmp[CODE_LENGTH] = {0};
int i;
name_int = calc_name(input, name_code);
calc_code1(name_code, tmp);
serial_length = calc_code2(tmp);
for (i = 0; i < serial_length; i++)
{
serial[i] = table[serial_length - i - 1] - ((name_int >> (i % 31)) % 10);
if (serial[i] < 0)
serial[i] += 10;
serial[i] += 0x30;
}
return 0;
}