【C语言】详解C语言操作符中的重点难题(代码+图解)

简介: 【C语言】详解C语言操作符中的重点难题(代码+图解)

文章目录

一、【例题1】

1、题目描述

统计二进制中1的个数

题目内容:

写一个函数返回参数二进制中 1 的个数。

比如: 15 :0000 1111

4 个 1

题目链接:二进制中1的个数

2、解题思路

这道题其实我在你真的懂C语言中的位操作符吗?这篇文章中讲到过解题方法;

这里直接上手

3、代码详解

int NumberOf1(int x)
{
  int c = 0;
  while (x)
  {
    x = x & (x - 1);
    c++;
  }
  return c;
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret = NumberOf1(n);
  printf("%d\n", ret);
  return 0;
}

二、【例题2】

1、题目描述

求两个数二进制中不同位的个数

题目链接:两个整数二进制位不同个数

2、解题思路

  • 这里我们只需要把两个数进行异或^(异或规则:相同为0,相异为1
  • 然后我们把异或的结果赋值给一个整型变量;
  • 再求出这个整型变量中有多少个1,就得到不同位的个数啦

如图:

image.png

3、代码详解

int diff(int x, int y)
{
  int z = 0;
  int c = 0;//计数器
  z = x ^ y;//存储异或的结果
  while (z)
  {
    z = z & (z - 1);//计算z中有多少个1
    c++;
  }
  return c;
}
int main()
{
  int m, n;
  scanf("%d %d", &m, &n);
  int ret = diff(m, n);
  printf("%d\n", ret);
  return 0;
}

运行结果:

image.png

三、【例题3】

1、题目描述

打印整数二进制的奇数位和偶数位

题目内容:

获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

2、解题思路

假设求100二进制的奇数位和偶数位

如图:

image.png

移动规则:

image.png

然后再把得到的结果和1相与&

(想与:两个都是1才是1,否则0)

3、代码详解

void print(int m)
{
  int i = 0;//写一个循环
  //打印奇数位
  printf("奇数位: ");
  for (i = 30; i >= 0; i -= 2)//30表示第31位数,要向右移动30位
  {
    printf("%d", (m >> i) & 1);
  }
  printf("\n");
  //打印偶数位
  printf("偶数位: ");
  for (i = 31; i >= 1; i -= 2)
  {
    printf("%d", (m >> i) & i);
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  print(n);
  return 0;
}

运行结果:

image.png

四、【例题4】

1、题目描述

判断整数奇偶性

判断一个整数的奇偶性,从键盘任意输入一个整数,编程判断它的奇偶性。

题目链接:判断整数奇偶性

2、解题思路

  • 这个问题对于我们的困扰在于:我们如何才能知道已经没有任何输入了,这就需要用到输入函数的返回值。
  • 我们知道输入函数为scanf,当这个函数返回EOF时,就代表没有任何输入了。所以我们可以循环判断函数的返回值是否等于EOF
  • 其中EOF是一个宏,可以认为它的值就是整数-1

它的定义如下:

#define EOF -1

3、代码详解

#include <stdio.h>
#define EOF -1
int main()
{
  int n = 0;
    //while (~scanf("%d", &n)),也可以使用 ~ 符号
  while (scanf("%d", &n) != EOF)
  {
    if (n % 2 == 0)
    {
      printf("Even\n");
    }
    else
    {
      printf("Odd\n");
    }
  }
  return 0;
}
  • 这里,我们先考虑scanf("%d", &n)这个函数的返回值,当你从控制台输入两个数时,它会根据输入的格式正确与否,返回输入成功的数的个数,所以正常情况下是返回2。
  • 当没有任何输入时,它会返回EOF,所以导致循环语句内的条件变为假,从而退出循环,退出循环以后就顺理成章的结束进程了;

总结:

EOF读取结束或者遇到错误,返回EOF

输入多个数字时,就需要用到EOF

五、【例题5】

1、题目描述

判断是元音还是辅音

题目链接:判断是元音还是辅音

2、解题思路

  • 这里也是需要我们多行输入,唯一不同的是要判断10个元音3字母(大写和小写)。
  • 所以我们可以定义一个数组,把输入的字母和数组进行比较。

3、代码详解

int main()
{
  char v[] = { 'a','A', 'e','E', 'i','I', 'o','O', 'u','U' };
  char ch = 0;
  while (~scanf("%c", &ch))
  {
    int i = 0;//判断10次
    for (i = 0; i < 10; i++)
    {
      if (ch == v[i])
      {
        printf("Vowel\n");
        break;//判断成功就跳出循环
      }
    }
    if (i == 10) //如果i=10,表示把ch判断了10次,都不是元音字母,那么只能是辅音字母了
    {
      printf("Consonant\n");
    }
  }
  return 0;
}

运行结果:

image.png

貌似情况不太对呀?

  • scanf("%c", &ch)当我们输入:a时,scanf其实读取到了a和\n;所以才会出现执行结果错误的情况

解决办法2中:

  • scanf(" %c", &ch),在%c前加一个空格
  • getchar()去清理缓冲区。

修改后的代码:

int main()
{
  char v[] = { 'a','A', 'e','E', 'i','I', 'o','O', 'u','U' };
  char ch = 0;
  while (~scanf(" %c", &ch))
  {
    int i = 0;//判断10次
    for (i = 0; i < 10; i++)
    {
      if (ch == v[i])
      {
        printf("Vowel\n");
        break;//判断成功就跳出循环
      }
    }
    if (i == 10) //如果i=10,表示把ch判断了10次,都不是元音字母,那么只能是辅音字母了
    {
      printf("Consonant\n");
    }
        //getchar();//清理缓冲区
  }
  return 0;
}

运行结果:

image.png

总结:

  • 读取字符时,才会考虑\n,所以要用到清理缓冲区
相关文章
|
2月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
65 4
|
1月前
|
存储 网络协议 C语言
【C语言】位操作符详解 - 《开心消消乐》
位操作符用于在位级别上进行操作。C语言提供了一组位操作符,允许你直接操作整数类型的二进制表示。这些操作符可以有效地处理标志、掩码、位字段等低级编程任务。
102 8
|
1月前
|
C语言
【C语言】逻辑操作符详解 - 《真假美猴王 ! 》
C语言中有三种主要的逻辑运算符:逻辑与(`&&`)、逻辑或(`||`)和逻辑非(`!`)。这些运算符用于执行布尔逻辑运算。
83 7
|
1月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
2月前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
81 1
|
3月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
62 10
|
3月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
3月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
3月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)

热门文章

最新文章