实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,将9表示成二进制为1001,有2位是1,因此如果输入数字9,该函数输出2。
我们拥有十余年网页设计和网站建设经验,从网站策划到网站制作,我们的网页设计师为您提供的解决方案。为企业提供成都做网站、成都网站设计、成都外贸网站建设、微信开发、微信小程序、成都手机网站制作、HTML5、等业务。无论您有什么样的网站设计或者设计方案要求,我们都将富于创造性的提供专业设计服务并满足您的需求。如果让我们将一个十进制的数转换成二进制的表示,我们就会不停的模除模除2取它的余数,因此,就可以用这样的方法解决:
#includeusing namespace std; size_t count_one_num(int n) { size_t count = 0; while(n != 0) { if((n % 2) == 1) count++; n /= 2; } return count; } int main() { int n = 7; size_t ret = count_one_num(n); cout<<"one number in "< 运行程序:
我们知道,任何一个数用机器语言来表示都是0和1的组合,而C/C++中提供了这样的一个运算符,右移操作符“>>”和左移操作符“<<”,它们是将一个数的二进制位进行相应的向左移位和向右移位,而在上面的问题中,可以不断地将整数向右进行移位,这样取到其最低位的数字和1数字进行相与,就能够得知最低位上的数字是1还是0了;
但是提到移位操作符会存在一个问题,当将一个数进行左移时,左边的位会被丢弃,而右边的位会补0;当一个数进行右移操作时,右边的位会被丢弃,那么左边的补位会存在两种情况:一种是逻辑移位,统一都补0;另一种是算数移位,会相应的补符号位;因此,在设计循环判断条件的时候,不能将判断数字是否为0作为循环条件了,而是应当将整数的位数也就是32位作为循环终止的条件,程序如下:
size_t count_one_num(int n) { int i = 32; size_t count = 0; while(--i) { if((n & 1) == 1) ++count; n = n>>1; } return count; }除了上面的方法,其实还有一种利用数字的二进制来解决的办法:可以想到,当一个数不为0的时候,它的二进制表示中至少有一个1,从而计数器就可以加1,然后就需要将二进制中的1一个一个地剔除掉直到数字变为0,那除了移位怎样才能办到呢?可以将数字 =(数字)&(数字-1),因为一个数字减1的时候,它最低位的一个1就会变成0,而最低位的1肯定都是0就会都变成1,也就相当于将数字12的二进制减1就为将1100减1变成了1011值为11,然后将1100和1011进行相&,那么就会变成1000,也就是成功的将12中的两个1变成了一个1,以此类推就可以统计出二进制中1的个数了,代码实现如下:
size_t count_one_num(int n) { size_t count = 0; while(n != 0) { ++count; n = n & (n-1); } return count; }这样的代码是不是比前两种更简洁直观呢,只是在理解上要稍微转一下弯。
《完》
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
本文标题:一个数的二进制表示中1的个数——10-创新互联
文章地址:http://chengdu.cdxwcx.cn/article/dpdceg.html