二进制中1的个数
2015-11-11 13:43
218 查看
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解析:如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。
举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
这么变态。。。这都能想到。。
解析:如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。
举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
public int searchNumberOne(int n){ int count = 0; while(n!=0){ count++; n = n & (n -1); } return count; } }
这么变态。。。这都能想到。。
相关文章推荐
- Android-Universal-Image-Loader 学习笔记(三)下载器分析
- JavaIO流
- android 九宫格 移动 并且删除 带动画效果
- 004 Median of Two Sorted Arrays [Leetcode]
- Linux GCC 编译源文件
- 编程基础知识之逻辑判断函数
- unique() 去重函数
- 关于CBitmap的一点心得
- tr和cut用法
- 数据库模式对象
- 单例模式——C++模板实现
- (系统讲解)java内存分配分析/栈内存、堆内存
- 感觉在学习的方法,没有一套自己的学习方法。
- c# ProxyServer 代理服务器 不是很稳定
- js简单的设置快捷键,hotkeys捕获键盘键和组合键的输入
- angularJS的路由ngRoute
- python基础之virtualenv
- 文件上传:swfupload.js、blueimp-file-upload
- 【转】支付宝官方回应关闭手势,微博遭引大量批评
- 数据库结构及基本概念