C语言 计数编号代码字母的二进制表示中0和1的

2admgd59  于 2023-04-29  发布在  其他
关注(0)|答案(4)|浏览(118)

基本上,我必须写一个代码,这样:
1.将字母作为输入。
1.计数其ascii值的二进制表示中的0和1的数量
1.报告(编号0)*(否。1s)
请帮我找出代码中的错误。

#include <stdio.h>
int main(){
    
    int x,y,count0,count1,a,r;
        scanf("%c",&x);
        a = (int)x;

        count0 = 0;
        count1 = 0;
        while(a != 0){
            r=a%2;
            if(r == 0) 
                count0 = count0 + 1;
            else if(r == 1) 
                count1 = count1 + 1;
            a = a/2;
        }
        y = count1 * count0;
        printf("%d\n",count0);
        printf("%d\n",count1);
        printf("%d",y);
        return 0;
}

显然这是错误的,因为对于输入'A',它应该打印5,2,10,但它给出了16,7,112。

pgky5nke

pgky5nke1#

因为你把x声明为int,所以scanf("%c",&x);产生:
测试c:5:17:警告:格式“%c”需要类型为“char *”的参数,但参数2的类型为“int *”[-Wformat=]
默认的char也是有符号的,如果你遇到一个负值,这可能会产生惊人数量的1和0。
将x的类型更改为unsigned char

unsigned char x;
int y,count0,count1,a,r;

那么代码就应该按照你的要求去做。
如果您的编译器中没有启用警告,请现在启用它们。它们通常有助于发现这样的问题。

8yoxcaq7

8yoxcaq72#

我记得K&R的一个老把戏;c &= c - 1清除c中的最低1位。

#include <stdio.h>

int main(void)
    {
    int ones, zeros;
    unsigned char c;
    
    scanf("%c", &c);
    for (ones = 0; c; ++ones)
        c &= c - 1;
    zeros = CHAR_BIT - ones;
    printf("zeros: %d\n", zeros);
    printf("ones: %d\n", ones);
    printf("product: %d\n", ones * zeros);
    }
4smxwvx5

4smxwvx53#

有两个问题:
1.正如teapot418在另一个答案中所说,你必须把你的字符读入一个无符号的char
1.当a == 0出现时,你就停止计数,这意味着你只会计数10,直到最重要的1。除空格字符外,其值为3200100000。您的代码将计数5个0和1个1。要解决这个问题,只需计算1,然后通过count0 = 8 - count1(或7 - count1,对于7位ascii)计算0的数量

zpf6vheq

zpf6vheq4#

我同意@SRNissen的说法,正确的答案是6,2,12,因为'A'在二进制中是0100 0001
我用masking来做这件事的代码是:

#include <stdio.h>
#include <limits.h>

int main(){
    unsigned char x = 'A';

    int count0 = 0;
    int count1 = 0;
    for( int i=0; i<CHAR_BIT; ++i)
    {
        count0 += !(x & 1<<i);
        count1 += !!(x & 1<<i);
    }

    int y = count1 * count0;
    
    printf("%d\n",count0);
    printf("%d\n",count1);
    printf("%d",y);
    return 0;
}

相关问题