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