输入一个字符,输出这个字符的二进制位中包含多少个1。 (这道题到底怎么做呢?)求思路!!

根本没有思路啊!!!!!!!!!!!!!!!!!

设置一个算子10000000(二进制),与输入的字符“按位与”,得到非0值则该位是1;将算子右移一位再与其“按位与”……直到算子为0。把所得非0值取逻辑值(非0的逻辑值是1)加起来就是这个字符的二进制编码中的1的个数。代码如下:

#include "stdio.h"
int main(int argc,char *argv[]){
char ch,s;
unsigned char opr;
printf("Input a character...\nch=");
scanf(" %c",&ch);
for(s=0,opr=0x80;opr;s+=!!(ch&opr),opr>>=1);//用!!将非0转换为1
printf("'%c' consists %d of '1'\n",ch,s);   
return 0;
}

运行样例如下:

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-02-18

通过位运算实现比较方便:

for(int i=0;i<8;i++)
{
    if((ch>>i) & 0x01 == 0x01)
        num++;
}

大致代码就是这样的。

追问

老师刚开始讲,我发觉您的思路比我清晰多了!
我用的DO WHILE 的 感觉麻烦多了
那个 为什么要用16进制呢??

追答

位运算,用十六进制表达更加清晰而已,你完全可以直接写:

if((ch>>i) & 1)
{
}

这样是完全等效的,只是代码不够直观罢了。

本回答被提问者采纳
第2个回答  2017-06-22
1、字符以ASCII码形式存在,可以在获取到该字符的ASCII码后操作。
2、得到ASCII码后进行二进制的转换。二进制的转换方法按十进制到二进制进行,采取除以2取余数的方式,可以将余数转为字符串形式,再继续用商除以2取余数,并将余数转为字符串形式后放在余数字符串的前面。最后当商为0的时候,将最后的余数加到余数字符串的前面。推荐使用循环方式完成。
3、判断1的个数,第一一个变量记录1的个数的计数器,循环遍历余数字符串,如果是1则计数器加一,直到遍历完成,同样推荐使用循环方式完成。
4、输出1的个数。