Edit :-
Faster way to get the common_ancestor in O(log(logn)) :-
int get_bits(unsigned int x) {
int high = 31;
int low = 0,mid;
while(high>=low) {
mid = (high+low)/2;
if(1<
return mid+1;
if(1<
low = mid+1;
}
else {
high = mid-1;
}
}
if(1<x)
return mid;
return mid+1;
}
unsigned int Common_Ancestor(unsigned int x,unsigned int y) {
int xbits = get_bits(x);
int ybits = get_bits(y);
int diff,kbits;
unsigned int k;
if(xbits>ybits) {
diff = xbits-ybits;
x = x >> diff;
}
else if(xbits
diff = ybits-xbits;
y = y >> diff;
}
k = x^y;
kbits = get_bits(k);
return y>>kbits;
}
Explanation :-
获取表示x和y所需的位,其中使用二进制搜索是O(log(32))x和y的二进制表示法的公共前缀是共同的祖先,无论哪个由更大的位表示由k带到相同的位>> diff k = x ^ y擦除x和y的公共前缀,通过后缀位找到表示剩余后缀shift x或y的位,以获得作为共同祖先的公共前缀 .
Example :-
x = 12 = b1100
y = 8 = b1000
xbits = 4
ybits = 4
diff = 0
k = x^y = 4 = b0100
kbits = 3
res = x >> kbits = x >> 3 = 1
ans : 1