LintCode 将整数A转换为B
2015-10-09 18:36
190 查看
将整数A转换为B
如果要将整数A转换为B,需要改变多少个bit位?
样例
如把31转换为14,需要改变2个bit位。
(31)10=(11111)2
(14)10=(01110)2
挑战
你能想出几种方法?
solution: 这题的意思就是比较A和B中不同位的个数及相异位的个数。因此,很容易想到异或操作,及相异为1,相同为0。因此可以先做C = A^B,然后在计算C的二进制表示中1的个数。其中计算C中二进制1的个数时使用左移,需要特别的注意,因为C可能为负数,负数的右移和正数的右移是有差别的。
code
当int型不是32位时会出现错误的答案,因此一种改进版本的代码为:
如果要将整数A转换为B,需要改变多少个bit位?
样例
如把31转换为14,需要改变2个bit位。
(31)10=(11111)2
(14)10=(01110)2
挑战
你能想出几种方法?
solution: 这题的意思就是比较A和B中不同位的个数及相异位的个数。因此,很容易想到异或操作,及相异为1,相同为0。因此可以先做C = A^B,然后在计算C的二进制表示中1的个数。其中计算C中二进制1的个数时使用左移,需要特别的注意,因为C可能为负数,负数的右移和正数的右移是有差别的。
code
class Solution { public: /** *@param a, b: Two integer *return: An integer */ int bitSwapRequired(int a, int b) { // write your code here int c = a ^ b; return getBitCount(c); } private: int getBitCount(int a) { int count = 0; //因为负数的右移是在前面填1,因此我们只需要移32就可。 for (int i = 1; i <= 32; ++i) { count += a & 1; a >>= 1; } return count; } };
当int型不是32位时会出现错误的答案,因此一种改进版本的代码为:
int getBitCount(int a) { int count = 0; while (a) { a = a & (a - 1); ++count; } return count; }
相关文章推荐
- 黑马程序员---OC学习笔记之简单的单例模式实现
- Mac上安装 Ruby运行环境以及CocoaPods的安装使用教程
- 钟南山:高收入群体往往老得快
- 【Win10 应用开发】实现数据的增量加载
- js如何去掉字符串中所有的逗号
- EasyUI 的常用方法
- pt-query-digest查询日志分析工具
- Servlet生命周期与工作原理
- android录制更大视频文件的修改
- 异常:org.json.JSONException: End of input at character 0 of
- Java基础知识强化之网络编程笔记09:TCP之客户端键盘录入服务器写到文本文件中
- 背景建模(前景检测)算法入门 下篇
- MyBatis入门08-MyBatis 缓冲
- 关于使用json库造成的内存泄露问题
- servlet的配置和上下文
- HDU 3836 Equivalent Sets(强连通缩点)
- POJ 1191 棋盘分割 (DP)
- 通过私有协议Chrome浏览器页面打开本地程序
- HTML5 Fundamental Syntax
- video.js的应用