cola_ 发表于 2020-7-31 15:54

C语言例题求助

本帖最后由 cola_ 于 2020-7-31 16:40 编辑

求助各位大佬给解释一下程序,小弟我刚步入C语言才疏学浅看不懂这个例子
程序是读取到两个非负整数安位进行逻辑与和逻辑或等运行,但是我看不懂他自定义的函数,也不知道这样写有什么好处




#include <stdio.h>
int count_bits(unsigned x)
{
    int count = 0;
    while(x) {
      if (x & 1U)    count++;
      x >>= 1;      
    }
    return (count);   
}
int int_bits(void)
{
    return count_bits(~0U);   
}
int print_bits(unsigned x)
{
    int i;
    for(i = int_bits() - 1; i >= 0; i--)
      putchar(((x >> i) & 1U) ? '1' : '0');   
}
int main(void)
{
    unsigned na, nb;
    puts("请输入两个非负整数。");
    printf("整数A:");    scanf("%u", &na);
    printf("整数B:");    scanf("%u", &nb);
    printf("\nA         =");    print_bits(na);
    printf("\nB         =");    print_bits(nb);
    printf("\nA & B       =");    print_bits(na & nb);
    printf("\nA | B       =");    print_bits(na | nb);
    printf("\nA ^ B       =");    print_bits(na ^ nb);
    printf("\n~A          =");    print_bits(~na);
    printf("\n~B          =");    print_bits(~nb);
    putchar('\n');
    return (0);   
}


EzGDNull 发表于 2020-8-1 13:45

#include <stdio.h>
int count_bits(unsigned x)
{
    int count = 0;//累计无符号整形x的bits位数
    while(x) {//直到x为0退出循环
      if (x & 1U)    count++;//x与无符号1与,也就是最低位为1,count加1,0则继续
      x >>= 1;//无符号整形x一次向右移动一位,便于上一个操作是,对于x的每一位操作,一直从低位到高位,按位与      
    }
    return (count);   
}
int int_bits(void)
{
    return count_bits(~0U); //~0U就是无符号整形0按位取反,也就是全1,也就是说这个数是固定32位无符号整形最大值
}
int print_bits(unsigned x)//从高位往低位打印无符号整形x的bit位
{
    int i;
    for(i = int_bits() - 1; i >= 0; i--)//i取值范围为,但是循环是i从31到0递减,所以这个是从高位开始,一直往低位打印
      putchar(((x >> i) & 1U) ? '1' : '0'); //从高位到低位打印无符号整形x的bits,x向有移动i位再与上无符号整形1,就是表示当前位为1则打印字符1,0则打印字符0
}
int main(void)
{
    unsigned na, nb;
    puts("请输入两个非负整数。");
    printf("整数A:");    scanf("%u", &na);
    printf("整数B:");    scanf("%u", &nb);
    printf("\nA         =");    print_bits(na);
    printf("\nB         =");    print_bits(nb);
    printf("\nA & B       =");    print_bits(na & nb);
    printf("\nA | B       =");    print_bits(na | nb);
    printf("\nA ^ B       =");    print_bits(na ^ nb);
    printf("\n~A          =");    print_bits(~na);
    printf("\n~B          =");    print_bits(~nb);
    putchar('\n');
    return (0);   
}

andersgong 发表于 2020-8-5 07:52

count_bits是计算一个无符号整数一共有多少位(BIT)为1
int int_bits(void)
{
    return count_bits(~0U);   
}
这个int_bits返回的结果就是最大的无符号整数一共有多少位,因为~0U就是全1的无符号整数了。

这样写最大的好处就是与系统无关,与平台无关,理论上可以自动计算获得不同平台上的无符号整数的最大位数。

然后print_bits就可以按照这个最大位数来逐位输出一个无符号整数了。
这个写法还是蛮聪明的,值得学习。

cola_ 发表于 2020-8-5 13:56

andersgong 发表于 2020-8-5 07:52
count_bits是计算一个无符号整数一共有多少位(BIT)为1
int int_bits(void)
{


多谢大佬指点

cola_ 发表于 2020-8-5 13:58

EzGDNull 发表于 2020-8-1 13:45
#include
int count_bits(unsigned x)
{


多谢大佬
页: [1]
查看完整版本: C语言例题求助