x&(x-1)和x&(-x)的讲解
2016-03-22 18:07
316 查看
x&(x-1)这个表达式有两个作用:
1、去掉x最右边的一个1(二进制)
2、判断一个整数是不是2的n次幂
这道微软的笔试题,显而易见的是,求x中二进制里面1的个数。
结果其实没什么,重要的是我们要知道为什么x&(x-1)为什么可以达到这样的效果。
关键在于(x-1)一定会把最低位的一个1扯下水,因为需要减1啊。再按位&一下,只会关系到最低的1,自然就可以了。
再看看(x&(-x))是个什么东西,这个的作用就是求出2^p(其中p: x 的二进制表示数中, 右向左数第一个1的位置)
有什么用呢?
在树状数组里面会用到。
还有呢?
没有发现吗?
这两个输出都是一样的结果。为什么呢?
1、去掉x最右边的一个1(二进制)
2、判断一个整数是不是2的n次幂
int func(x) { int countx =0; while(x) { countx ++; x = x&(x-1); } return countx; }
这道微软的笔试题,显而易见的是,求x中二进制里面1的个数。
结果其实没什么,重要的是我们要知道为什么x&(x-1)为什么可以达到这样的效果。
关键在于(x-1)一定会把最低位的一个1扯下水,因为需要减1啊。再按位&一下,只会关系到最低的1,自然就可以了。
再看看(x&(-x))是个什么东西,这个的作用就是求出2^p(其中p: x 的二进制表示数中, 右向左数第一个1的位置)
有什么用呢?
在树状数组里面会用到。
还有呢?
int main(){ int x; while(cin>>x){ cout<<(x&(x-1))<<endl; int t=x&(-x); cout<<(x^t)<<endl; } return 0; }
没有发现吗?
这两个输出都是一样的结果。为什么呢?
相关文章推荐
- MANIFEST.MF文件全面解析
- 如何安装rockmongo(gui for mongodb)
- DB2活动日志满的原因、分析、处理与避免
- Linux下安装Oracle11g中文乱码,DISPLAY未通过
- iOS开发: 做真机测试时 遇到的 bitcode 的问题
- 适配器模式
- org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class ‘XXX’
- PHPEXCEL在thinkphp中封装成类使用
- eclipse的使用总结
- 手打struts知识点
- EvenBus3.0中文翻译(三)Delivery Threads (ThreadMode)
- 操作系统--命令解释程序_1
- Javascript写的10进制与16进制互转
- Linq to sql 自定义类型
- 法线变换
- BFS和DFS优先搜索算法
- 关于手机连不上拼命循环弹出“Connection attempts: x远程主机强迫关闭了一个现有的连接 ”的解决办法
- 正版win8平均15分钟蓝屏一次。显示critical structure corruption(ntfs.sys)
- NodeJS - Error: The specified procedure could not be found
- Hibernate 以流的方式获取数据