基数排序。为什么Xor?

时间:2012-05-08 16:29:56

标签: c radix-sort

我正在研究基数排序算法,但我无法理解一些原始的源代码。

static void rad_sort_u(unsigned *from, unsigned *to, unsigned bit)
{
    if (!bit || to < from + 1) return;

    unsigned *ll = from, *rr = to - 1,tmp;
    while (1) {
        /* find left most with bit, and right most without bit, swap */
        while (ll < rr && !(*ll & bit)) ll++;
        while (ll < rr &&  (*rr & bit)) rr--;
        if (ll >= rr) break;
        swap(*ll, *rr);
    }

    if (!(bit & *ll) && ll < to) ll++;
    bit >>= 1;

    rad_sort_u(from, ll, bit);
    rad_sort_u(ll, to, bit);
}

/* sort signed ints: flip highest bit, sort as unsigned, flip back */
static void radix_sort(int *a, const size_t len)
{
    size_t i;
    unsigned *x = (unsigned*) a;

    for (i = 0; i < len; i++) 
            x[i] ^= INT_MIN;

    rad_sort_u(x, x + len, INT_MIN);

    for (i = 0; i < len; i++) 
            x[i] ^= INT_MIN;
}

我不知道它为什么使用这一行 for (i = 0; i < len; i++) x[i] ^= INT_MIN;

我知道它的xor,但我不明白在这种情况下使用这个运算符。

1 个答案:

答案 0 :(得分:2)

切换MSB(最重要的位)。

根据我的理解,INT_MIN根据所使用的编译器和系统而有所不同,但它通常类似于十六进制的0x80000000,它将以二进制的形式计算为10000 ... 0。

如果你对其中任何一个XOR,你可以切换它:

eg: if y = A xor B

y | A B
==+====
0   0 0
1   0 1
1   1 0
0   1 1

y | A 1
==+====
1   0 1
0   1 1

Therefore
A xor 1 = !A

因此,当执行该行时,x [i]的最高位正在切换。如果它为零,那么它现在是一个。如果它是一个,现在为零。

简而言之:XOR与0 XOR,得到原始值X.XOR任意值X,用1,得到X的补码,!X。

 Y | X A
===+====
 X   X 0
!X   X 1