C程序设计语言练习题之 2-9

来源:互联网 发布:北航软件工程硕士 编辑:程序博客网 时间:2024/05/03 09:07

原题是利用整数x &x-1可以消除掉x的二进制字符串右侧第一个“1”的原理,反复进行&,最终将x变为零。而反复的次数就是x这个字符串中“1”出现的次数。

原先想利用while进行循环,结果发现while存在一个问题:最后一个“1”被消除掉,x为0后,此次循环将不进行,导致最终的循环次数比“1”的实际数量要少1。虽然可以在初始化或返回值时+1的方法,但并不合理,所以舍弃了while而使用for进行循环。但while的部分还作为备注留在函数中。

源代码:

#include <stdio.h>int bitcount(int x);int main(){int x = 10000;//此句定义需要处理的数值,可以随便改动 printf("%d\n", bitcount(x));}int bitcount(int x){int b;/* while (x &= (x - 1) )++b;*///尝试了一下使用while的语句,结果发现并不合理。因为while在x值等于零的时候直接退出循环,会导致b最终比真实值要小1 for (b = 0; x != 0; x &= (x - 1))//函数的关键。b初始化为0,用x和x-1的二进制值进行&,每次都会消除掉x二进制值右侧的一个1,同时b+1,当x最后变为零的时候,返回b值,也就是b二进制字符串中1的数量 b++;return b; }


0 0
原创粉丝点击