C++操作符优先级带来的错误

在刷LeetCode题目:190. 颠倒二进制位:颠倒给定的 32 位无符号整数的二进制位时,可以利用左移和右移操作符来实现数字翻转:

错误解法:

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_i num=0;
        for(int i=0;i<32;i++){
            num=num<<1+((n>>i)&1);//操作<<优先级不高
        }
        return num;
    }
};

这里<<操作符优先级低于+,本来的想法是num每次循环都会左移一位,n会右移i位并且取最低位的数。错误的解法导致实现是num每次移1+((n>>i)&1)位了。

正确的解法:

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_i num=0;
        for(int i=0;i<32;i++){
            num=(num<<1)+((n>>i)&1);//操作<<优先级不高
        }
        return num;
    }
};

多了个括号而已。

C++操作符的优先级参考: https://www.cnblogs.com/ywl925/p/3710246.html

 

posted @ 2018-10-31 11:00  Ivan_chen  阅读(171)  评论(0编辑  收藏  举报