leetcode 面试题 05.06. 整数转换

今天遇到这样一个题目,犯了一个低级错误 想想就觉可笑,又得挺有意思的 特来分享一下;

题目是这样的:

leetcode 面试题 05.06. 整数转换_第1张图片

 这是我一开始写的带码 写完的时候,我还在洋洋得意 觉得太简单了,但是运行完就打脸了;

int convertInteger(int A, int B){
    int count = 0;
    int i = 0;
    
    for(i = 0;i<32;i++)
    {
        if(A&1 != B&1)
        {
            count++;
        } 
        A=A>>1;
        B=B>>1;
    }
    return count;
}

为什么会和结果不一样呢?

这是因为运算优先级的问题。 但是这里 & 的优先级的确要低于 != 。

所以我们要给 运算加一对括号;

我们再深入的思考一下:

如果我们遇到这样的代码           a*b + c*d + e*f     

我们知道他们之间其实到底是怎么运算的吗?

是先a*b      c*d     e*f     之后再加一起  还是a*b   , c*d   , a*b + c*d  , e*f    ,a*b + c*d + e*f     

我们的的确确知道 * 的运算级高于 +

但是把并不一定 这就意味着  第三个 * 比第一个 + 早一步执行;   

因为这里 无论是第一种 还是第二种  计算的结果是一样的;

但是 我们要知道 如果  有一天 有一个代码 你虽然知道他们之间的运算优先级,但是不知道他们之间是怎么进行运算的,像这样

int fun()
{
     static int count = 1;
     return ++count;
}
int main()
{
     int answer;
     answer = fun() - fun() * fun();
     printf( "%d\n", answer);//输出多少?
     return 0;
}

但是上述代码 answer = fun() - fun() * fun(); 中我们只能通过操作符的优先级得知:先算乘法,
再算减法。
函数的调用先后顺序无法通过操作符的优先级确定。

你可能感兴趣的:(leetcode,java,算法)