C编程练习题: 翻转整数位


learn-to-code C编程练习题: 翻转整数位 ACM题解 数据结构与算法 程序设计

学编程

题意: 给定两个整数, 计算从一个整数需要翻转几个位才能到另一个整数.
比如: 给定29 二进制为11101 和 15, 二进制是01111, 则答案是2次.

这题的关键就是用 XOR 异或来获得两个整数不同位. 因为只有当两个位不一样的时候 异或的结果才是1. 所以我们可以写成以下循环, 每次向右移1位, 累计 c & 1

1
2
3
4
5
6
7
int bitSwapRequired(int a, int b) {
  int count = 0;
  for (int c = a^b; c != 0; c >>>= 1) {
    count += c & 1;
  }
  return count;
}
int bitSwapRequired(int a, int b) {
  int count = 0;
  for (int c = a^b; c != 0; c >>>= 1) {
    count += c & 1;
  }
  return count;
}

我们还可以稍微改进一下, 就是用 x & (x – 1) 来移除最右边的那个1. 这样循环可以写成:

1
2
3
4
5
6
7
int bitSwapRequired(int a, int b) {
  int count = 0;
  for (int c = a^b; c != 0; c &= (c - 1)) {
    count ++;
  }
  return count;
}
int bitSwapRequired(int a, int b) {
  int count = 0;
  for (int c = a^b; c != 0; c &= (c - 1)) {
    count ++;
  }
  return count;
}

这题还是在初面的时候挺常见的, 也是较简单, 但是如果没有看过当场还不一定想出一个很好的方法.

英文: C Coding Exercise – Flip the Integers (Bit Manipulation)

GD Star Rating
loading...
本文一共 190 个汉字, 你数一下对不对.
C编程练习题: 翻转整数位. (AMP 移动加速版本)
上一篇: C++编程练习题: 对两单向链表求和
下一篇: C++ 编程练习题 - 最多水容器 (递归)

扫描二维码,分享本文到微信朋友圈
6dc6272f3d58cfb1fadb40fa410d05bf C编程练习题: 翻转整数位 ACM题解 数据结构与算法 程序设计

评论