在编写函数,获取一个数的二进制表示中1的数量时,如果采用左移后与最高位为1的数,进行位与运算。那么运算符的优先级需要特别注意。
完整函数如下,其中0x80000000表示32位整数中最高位为1的数,二进制表示为1000 0000 0000 0000 0000 0000 0000 0000
int getNumOf1InBin1(int n) { int cnt = 0; while (n != 0){ if ((n & 0x80000000) == 0x80000000) //与运算需要加括号 cnt++; n <<= 1; } return cnt; }
如果写成
if (n & 0x80000000 == 0x80000000)
则先判断 两个负数是否相等,当然是相等的,结果为1,n再与1进行与运算。显然,这里的逻辑不是我们想要的。因此,需要加括号,先做与运算,将非最高位置为0,再判断最高位是否为1。
当然该功能还有更好的办法,暂且不表。
优先级有疑问可参考下表。