当前位置: 首页 > news >正文

C语言初阶必会的练习题(3)之位操作符(^ 、、>>等)的应用

C语言初阶必会的练习题(3)

  • 放在最前面的
  • 1、不允许创建临时变量,交换两个整数的内容
    • 1.1、分析:见代码注释
        • (a)方法 1
        • (b)方法 2
    • 1.2、结果展示
        • 方法 1 的 结果:
        • 方法 2 的 结果:
  • 2、统计二进制中1的个数
    • 2.1、分析:见代码注释
        • (a)方法 1
        • (b)方法 2
            • 方法 2 的原理图
        • (c)方法 3
            • 方法 3 的原理图
    • 2.2、结果展示
        • 方法 1 的 结果:
        • 方法 2 的 结果:
        • 方法 3 的 结果:
  • 3、打印整数二进制的奇数位和偶数位
    • 3.1、分析:见代码注释
    • 3.2、结果展示
        • 展示 1
        • 展示 2
  • 4、求两个数 二进制中不同位的个数
    • 4.1、分析:见代码注释
    • 4.2、结果展示
  • END

放在最前面的

🎈🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集:C语言初阶合集,希望能帮到你!!!😍 😍
👋🏼🎉🎊创作不易,欢迎大家留言、点赞加收藏!!! 🥳😁😍

1、不允许创建临时变量,交换两个整数的内容

1.1、分析:见代码注释

(a)方法 1
//(方法 1):可以使用加减法,然后实现两个数字的互换 #include<stdio.h>//方法1
int main()
{//定义两个整型变量 a、bint a = 0;int b = 0;//输入scanf("%d %d", &a, &b);//定义一个整型变量 sumint sum = 0;//将 a + b的值赋值给 sumsum = a + b;//进行加减法操作,实现两个数字 的交换a = sum - a;//即 a = a + b - a = bb = sum - a ;//即 b = a + b - b = a//输出printf("%d %d\n", a, b);return 0;
}
(b)方法 2

补充 ( ^ 按位异或操作符) 的使用:

对 按位异或操作符 ( ^ )还感到一头雾水的小伙伴们,快来点击下面的这篇超实用博客文章👇,一起揭开它的神秘面纱吧!🔍✨
C语言中操作符详解(上)


方法2的原理图:

  • 图片 1

  • 图片 2

  • 图片 3

  • 图片 4

//(方法2):可以使用位操作符(^ -- 按位异或) #include<stdio.h>int main()
{//定义三个整型变量 a、b、cint a = 0;int b = 0;int c = 0;//输入scanf("%d %d", &a, &b);//使用位操作符(^ -- 按位异或),实现两个数字 的交换c = a ^ b;b = c ^ b;a = c ^ a;//输出printf("%d %d\n", a, b);return 0;
}

1.2、结果展示

输入两个数字: - 5 和 10

方法 1 的 结果:

方法 2 的 结果:

在这里插入图片描述

2、统计二进制中1的个数

描述:

写一个函数返回参数二进制中 1 的个数。
比如: 15
二进制位:0000 1111
有4 个 1

2.1、分析:见代码注释

(a)方法 1
//统计二进制中1的个数
// 
//首先我们先把问题拆分成我们熟悉的问题
//(1)要得到二进制数的每一位
//(2)进行统计 二进制数字 1 的个数
// 
//(1)要得到二进制数的每一位
//类比 输出十进制的每一位是 
// (i)  % 10
// (ii) / 10
// 
//(2)进行统计 二进制数字 1 的个数
//在得到每一位的数字时候,判断是否为 1
//是 1 则 计数器加 1,反之,则不进入 if 语句 #include<stdio.h>//定义一个 NumberOf1 函数,返回类型是 int, 
//参数是 unsigned int(无符号整型) n
int NumberOf1(unsigned int n)
{//定义一个计数器int count = 0;// while 循环while (n != 0){//判断 n % 2 的结果是否等于 1if ((n % 2) == 1){//如果是,则 count + 1count++;}// 将 n / 2 赋值给 nn = n / 2;}//返回 countreturn count;
}int main()
{//定义int n = 0;//输入scanf("%d", &n);//调用函数,用于输出数字的每一位,并统计 1 的个数int ret = NumberOf1(n);//输出printf("%d", ret);return 0;
}
(b)方法 2

补充:
嘿小伙伴们!👋🏼 如果有人对C语言里 按位与(&)操作符📜 还感到一头雾水🤯,别急!😌 点击下面的链接🔗,让我们一起复习一下,
把这些让人头疼的概念搞定吧!💪💡

C语言中操作符详解(上)

方法 2 的原理图

#include<stdio.h>int NumberOf1(int n)
{//定义一个计数器int count = 0;//定义一个整型变量 iint i = 0;// for 循环 for (i = 0; i < 32; i++){// if 条件判断语句// 判断是条件是 (n >> i) -- n 右移 i 位// 与 1 进行相与(对应的二进制序列 有 0 则是 0,两个同时为 1 才为 1)// 的结果是否 等于 1if (((n >> i) & 1) == 1){//如果是,则 count+1count++;}}//返回 countreturn count;
}int main()
{//定义int n = 0;//输入scanf("%d", &n);//调用函数,并统计 1 的个数int ret = NumberOf1(n);//输出printf("%d", ret);return 0;
}
(c)方法 3
方法 3 的原理图

int NumberOf1(int n)
{//定义一个计数器int count = 0;// while 循环while (n != 0){//进入循环即 n != 0,则 count + 1count++;// 将 n 和 (n - 1)  进行 相与(对应的二进制序列 有0 则是 0,两个同时为 1 才为1)// 并将结果 赋值给 nn = n & (n - 1);}//返回 countreturn count;
}int main()
{//定义int n = 0;//输入scanf("%d", &n);//调用函数,并统计 1 的个数int ret = NumberOf1(n);//输出printf("%d", ret);return 0;
}

2.2、结果展示

方法 1 的 结果:

方法 2 的 结果:

方法 3 的 结果:

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

描述:

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

3.1、分析:见代码注释

  • 思路展示:

void Print(int n)
{//定义一个整型变量 iint i = 0;//打印提示信息printf("奇数位:");// for 循环 for (i = 30; i >= 0; i -= 2){printf("%d ", (n >> i) & 1);}//打印提示信息printf("\n偶数位:");// for 循环 for (i = 31; i >= 1; i -= 2){printf("%d ", (n >> i) & 1);}
}int main()
{//定义int n = 0;//输入scanf("%d", &n);//调用函数,用于打印整数二进制的奇数位和偶数位Print(n);return 0;
}

3.2、结果展示

展示 1
  • 输入数字 1

  • 数字1 在32位机器上的二进制序列

  • VS输出结果图片展示

展示 2
  • 输入数字 10

  • 数字10 在32位机器上的二进制序列

  • VS输出结果图片展示


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

描述:

编程实现:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子: 1999 2299
输出例子:7

4.1、分析:见代码注释

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main()
{//定义两个整型变量 a、bint a = 0;int b = 0;//输入scanf("%d %d", &a, &b);//定义一个整型变量 iint i = 0;//定义一个整型变量 count,用作计数器int count = 0;// for 循环for (i = 0; i < 32; i++){// if 条件语句//  判断条件是 a 和 b 的每一位(右移 i 位操作)分别与 1 进行 //  按位与(对应的二进制序列,数字同时为 1才为 1,有 0 则为 0)//   即得到 a 和 b 的二进制序列的每一位进行 一 一 比较if (((a >> i) & 1) != ((b >> i) & 1)){//计数器 count 加 1count++;}}//输出printf("%d\n", count);return 0;
}

4.2、结果展示

输入例子: 1999 2299
输出例子: 7

END

每天都在学习的路上!
On The Way Of Learning

“亲爱的读者们,文章到这里就结束啦😃。在阅读过程中有没有遇到什么疑问等等❓欢迎在评论区留言告诉我哦,期待与你的互动交流🤗!”


http://www.mrgr.cn/news/68594.html

相关文章:

  • 11.06学习
  • ssm066农家乐信息平台的设计与实现+vue(论文+源码)_kaic
  • 图说复变函数论重大错误:将无穷多各异平面误为同一面
  • 使用ffmpeg和mediamtx模拟多通道rtsp相机
  • Spring-cloud 微服务 服务注册_服务发现-Eureka
  • 快消零售行业企业员工培训的数字化转型
  • 什么是crm客户关系管理系统?全面认识指南
  • C++ EBO介绍
  • qt QClipboard详解
  • petty 状态管理库文档
  • 【Linux】进程信号全攻略(一)
  • 【论文复现】基于深度学习的手势识别算法
  • 2024年了,还适合入行嵌入式吗?
  • jdk17启动项目报错
  • 安装指定版本的transfomers报错ERROR: Failed building wheel for tokenizers
  • 深究JS底层原理
  • np.clip函数
  • prompt资料收集
  • 《瀚文欣赏的唐诗集》
  • 【高等数学】微分学的应用
  • 挑选BPM软件秘籍,揭秘六大必备功能
  • Python练习12
  • ResNet18模型扑克牌图片预测
  • MySQL架构原理之存储引擎
  • 以梧桐数据库为例讲解如何计算用户连续登录比率
  • 头戴式耳机百元价位推荐?2024头戴式耳机性价比推荐