#include <stdio.h>
#include <stdlib.h>
#define TO_L(s) (strtol((s), NULL, 16))
int tsb(unsigned long xa, unsigned long xb) {
unsigned long v = xa ^ xb;
static const unsigned long b[] = {
0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000L, 0xFFFFffff00000000L
};
static const unsigned int S[] = { 1, 2, 4, 8, 16, 32 };
unsigned int r = 0;
#define STEP(i) \
if(v & b[i]) { \
int t = S[i]; \
v >>= t; \
r |= t; \
}
STEP(5)
STEP(4)
STEP(3)
STEP(2)
STEP(1)
STEP(0)
return r;
}
int main(int ac, char **av) {
return printf("%d\n", tsb(TO_L(av[1]), TO_L(av[2]))), 0;
}
我认为这个实现了你的算法,并且非常快,只需要6步。请参见这个位操作技巧的绝佳源泉。
so ross$ ./a.out 1f f
4
so ross$ ./a.out 471234abcdabcd 981234abcdabcd
55
so ross$ ./a.out 1deadbeef 7feedface
34