题意: 给定两个整数, 计算从一个整数需要翻转几个位才能到另一个整数.
比如: 给定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)
C/C++编程
- C++ 编程练习题: 如何合并两个二叉树?
- C++ 编程练习题 - 找出第三大的数
- C++ 编程练习题 - 最多连续的 1
- C++ 编程练习题 - 左子树叶节点之和 (深度优先+广度优先+递归)
- C++ 编程练习题 - 最多水容器 (递归)
- C++的异步编程: std::future, std::async 和 std::promise
- C编程练习题: 翻转整数位
- C++编程练习题: 找出字符串的所有大小小组合
- C/C++ 中的内存管理器(堆与栈)
- C++编程练习题: 对两单向链表求和
GD Star Rating
loading...
本文一共 190 个汉字, 你数一下对不对.loading...
上一篇: C++编程练习题: 对两单向链表求和
下一篇: C++ 编程练习题 - 最多水容器 (递归)
扫描二维码,分享本文到微信朋友圈
