需要注意,C++对于无符号数进行逻辑右移,对于有符号数进行算术右移

1. 统计二进制位中1的个数

  1. //每次操作将最低位的1置为0
  2. int count = 0;
  3. while(num){
  4. num &= num - 1; //例如: 10110100 & 10110011 = 10110000
  5. count++;
  6. }
  7. cout << count;
  1. //逐位检查是否为0
  2. int count = 0;
  3. for (int i = 0; i < 32; i++){
  4. count += num & 1;
  5. num >>= 1;
  6. }
  7. cout << count;

2. 数组中只出现过一次的数

题目:在数组中,除了一个数只出现过一次以外,其他数都出现过两次,求只出现过一次的这个数

  1. //根据异或运算的性质,相同的数异或等于0,0 ^ x = x,且异或运算满足交换律
  2. //所以将数组中所有的数都使用异或运算计算一遍就能得出只出现过一次的数
  3. int find(vector<int> vec){
  4. int ret = 0;
  5. for (int i: vec)
  6. ret ^= i;
  7. return ret;
  8. }