位操作符
& 按位与:遇0为0
| 按位或:遇1为1
^ 按位异或:相同为0,相异为1
注:都是在二进制的情况下,且操作数都是整数
移位操作符
<< 左移操作符
>> 右移操作符
注:都是在二进制的情况下
左移操作符
左移:左边抛弃,右边补0
num << 1,左移之后的值发生了变化,但是此时左移之后的值并没有赋值给num,所以num只剩的值并没有改变。
int num = 9;
num = num << 1;
此时num的值就发生了改变
右移操作符
逻辑移位
左边用0填充,右边丢弃
算术移位
右边丢弃,左边用改值原来的符号位填充
注意:对于移位操作数,不要移动负数位,如:
int num = -1;
num << -1; // 出错
标准为定义,所以避免这样使用
计算二进制中1 的个数
请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
采用移位操作符和位操作符:
class Solution {
public:
int hammingWeight(uint32_t n) {
uint32_t count = 0;
while(n)
{
if((n&1)==1)//和1与操作,取出二进制的最后一位
{
count++;
}
n>>=1;//右移丢弃
}
return count;
}
};
总结
要牢记这两种操作符的特性,位操作符和移位操作符在某些场合还是很方便的,灵活性很高,效率也比较高,这个具体的问题具体讨论。