Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1847006
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2388
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(184)

文章存档

2021年(26)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: C/C++

2018-03-07 19:21:31

老早以前就已经见过这道题目了,但是当时只是记住了一个结果,如下:

点击(此处)折叠或打开

  1. int res = 0;
  2. while(n){
  3.     res++;
  4.     n=n&(n-1);
  5. }

当时看到有这个简单的解法,就直接记住了,没有去理解透彻,现在再看,只是知其然,不知其所以然了,手动抹泪。。。
言归正传,解释一下上述代码,n-1 表示将n二进制表示中最右边的那个1变成0,其后(如果有的话)所有的0变成1,前面所有位不变,n&(n-1)表示的值就是将n二进制表示当中的最右边的那个1去掉的结果,每次循环去掉一个,直到为0,则res最终为所求。
举个栗子:13的二进制表示为1101,执行上述函数:
第一轮:n=1101, res = 1, n = 1100;
第二轮:n=1100, res = 2, n = 1000;
第三轮:n=1000, res = 3, n = 0;
最终res为所求~
阅读(2840) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~