[topcoder]BinaryCards

现在觉得有空时可以刷一下topcoder的DIV 2的Lvl 3的题目。感觉和刷LeetCode和WikiOi都是不一样的。

http://community.topcoder.com/stat?c=problem_statement&pm=11552&rd=14544

http://apps.topcoder.com/wiki/display/tc/SRM+519

这道题目是找规律,从6变到8的过程中有最大的15;而由35到38的过程中最大是39,主要是去掉32后,3->6的过程中有个4,所以变成32+7。所以算法就是找到最高的那个不同的位,然后把后面的都变成1就行了。

但实现的时候不熟练位操作,就参考了标程。可以看到判断某两个位是否一样可以用异或^,然后和1的shif比较。而最后把后面的位都变1则是和1的左移(就是2的幂)减一进行或做到的。

public class BinaryCards
{
    public long largestNumber(long A, long B)
    {
        if (A == B) return A;
        for (int i = 60; i >= 0; i--)
        {
            if (((A^B) & (1l<<i)) != 0)
                return A | ((1l<<(i+1))-1);
        }
        return A;
    }
}

  

原文地址:https://www.cnblogs.com/lautsie/p/3337918.html