今天无聊拿起《编程之美》看了下,发现原来n&(n-1)还有很多妙用。
n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子:
n = 10100(二进制),则(n-1) = 10011 ==》n&(n-1) = 10000
可以看到原本最低位为1的那位变为0。
弄明白了n&(n-1)的作用,那它有哪些应用?
1. 求某一个数的二进制表示中1的个数
while (n >0 ) {
      count ++;
      n &= (n-1);
}

2. 判断一个数是否是2的方幂
n > 0 && ((n & (n - 1)) == 0 )

3. 计算N!的质因数2的个数。
容易得出N!质因数2的个数 = [N / 2] + [N / 4] + [N / 8] + ....
下面通过一个简单的例子来推导一下过程:N = 10101(二进制表示)
现在我们跟踪最高位的1,不考虑其他位假定为0,
则在
[N / 2]    01000
[N / 4]    00100
[N / 8]    00010
[N / 8]    00001
则所有相加等于01111 = 10000 - 1
由此推及其他位可得:(10101)!的质因数2的个数为10000 - 1 + 00100 - 1 + 00001 - 1 = 10101 - 3(二进制表示中1的个数)

推及一般N!的质因数2的个数为N - (N二进制表示中1的个数)

目前看到只有这些应用,但只要理解了n&(n-1)的原理及作用,在碰到相关问题时也会比较容易解决。

最新文章

  1. Building OpenCASCADE on Debian
  2. Android 学习第15课,Android 开发的单元测试、及输出错误信息
  3. 由项目中一个hash2int函数引发的思考
  4. Java关键字——final
  5. 创建文本,innerHTML与createTextNode的使用
  6. Combination Sum 和Combination Sum II
  7. CString.Format的详细用法(转)
  8. Android开发-API指南-<instrumentation >
  9. CentOS 安装 mono
  10. Entity Framework 6.1 学习系列1--概况、安装
  11. 线性表之顺序存储结构(C语言动态数组实现)
  12. Web 前端 —— javaScript
  13. OS error set
  14. bzoj 1196: [HNOI2006]公路修建问题 二分+并查集
  15. 图片,音频资源预加载和文档dom加载
  16. MDX 用Ancestors得到Hierarchy中指定Level的值(附带SCOPE用法之一)
  17. POJ 2251 三维BFS(基础题)
  18. C++求出旋转数组的最小数字
  19. android项目 之 记事本(11) ----- 加入数据库
  20. 项目总结19:layui实现表格渲染、表格搜索、数据获取

热门文章

  1. Linux 系统自动备份数据库及定时任务的设置
  2. Fedora 14 安装完后的设置 添加源 更新软件
  3. P2330 05四川 繁忙的都市
  4. 【CF20C】Dijkstra?(DIJKSTRA+HEAP)
  5. 首次远程安装 GlassFish 后以远程 Web 方式访问其后台管理系统出现错误的解决方法(修订)
  6. 笔记-迎难而上之Java基础进阶4
  7. Nginx图片防盗链的方式
  8. Objc的底层并发API(转)
  9. Linux 端口防火墙
  10. cygwin搭建ssh服务器