C语言与操作符相关的经典例题

目录

一道变态的面试题:不能创建临时变量(第三个变量),实现两个数的交换。

编写代码实现:求一个整数存储在内存中的二进制中1的个数。  

 二进制位置0或者置1


如果以下的知识点不是很清楚的可以去看这篇文章:操作符详解(上)-CSDN博客

一道变态的面试题:不能创建临时变量(第三个变量),实现两个数的交换。

这个题如果没有那个限制条件,我们一般都是创建第三个变量来处理。

法一:

//创建临时变量
#include <stdio.h>
int main()
{int a = 0;int b = 0;printf("请输入交换前的变量a与b:");scanf("%d%d", &a, &b);int c = 0;c = a;a = b;b = c;printf("交换后a=%d,b=%d\n", a, b);return 0;
}

第二种方法可能也是比较容易想到的,通过计算和来减去对应的。

法二:


//加减法
#include <stdio.h>
int main()
{int a = 0;int b = 0;printf("请输入交换前的变量a与b:");scanf("%d%d", &a, &b);a = a + b;b = a - b;//a+b-ba = a - b;//a+b-aprintf("交换后a=%d,b=%d\n", a, b);return 0;
}

这个法二其实严格来说,是有错误的。当a和b的值接近一个整形能存储的最大值是,它们两的和就会超出这个整形的最大值,从而导致溢出的问题。 

第三种方法应该只有那些大佬才能够想到。 

 法三:

#include <stdio.h>
int main()
{int a = 0;int b = 0;printf("请输入交换前的变量a与b:");scanf("%d%d", &a, &b);a = a ^ b;b = a ^ b;//a^b^b=aa = a ^ b;//a^b^a=bprintf("交换后a=%d,b=%d\n", a, b);return 0;
}

这个方法涉及了一个知识点:0^a=a,a^a=0。

这个也用画图来解释一下吧: 

编写代码实现:求一个整数存储在内存中的二进制中1的个数。  

如果拿到这个题目的时候没思路的话,就可以先想一想十进制,求一个十进制数中1的个数,那么这个也就比较简单了,我们可以先%10,看看最后一位是否等于1,再/10赋给这个数更新一下,再%10拿到倒数第二位看看是否等于1,就这样一直%10,/10,知道最后这个/10的商为0,就可以停止了。同理,这个二进制我们也可以通过%2,/2的方法来计算。

#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);int count = 0;while (n){if (n % 2 == 1){count++;}n /= 2;}printf("%d\n", count);return 0;
}

但是很遗憾的是这个代码只能求正整数,而对于负整数就不行了。

例如:当我们输入-1时,输出的却是0。我们知道-1的补码全是1,正确输出的话应该要是32。

代码演示:

其实这个问题还是比较好解决的,既然负数不行,那我们就把它变成无符号数,而-1的补码是32个1,那么对应的无符号数就是一个非常大的数字了。

#include <stdio.h>
int main()
{unsigned int n = 0;scanf("%d", &n);int count = 0;while (n){if (n % 2 == 1){count++;}n /= 2;}printf("%d\n", count);return 0;
}

但是如果题目要求我们用的是有符号整数,那么我们应该怎么办呢? 其实这里就可以用到那个按位与(&)操作符。这里我们就按照那个思路来想一想,当给出了一个二进制数字,我们按位与(&)上一个1,那么我们就只要看第32个比特位了(因为两个数按位与(&)的规则是对应的二进制位同为1,才是1,否则为0。而1的二进制补码,只有第32个比特位才是1,其余的都是0,那么无论什么数按位与(&)1,最终的结果是前面的第31个都是0了,只有第32个比特位还不确定。),如果那个数第32个比特位为1,那么最终的结果就是1,如果那个数第32个比特位是0,那么最终的结果就是0了。这是第32位的计算结果,如果要想知道前面的结果,就只能通过移位符来来把前面的比特位移至最后一位,再来比较。这里可能有小伙伴会有疑问,为什么不移1呢?把1一位移位的移去前面来比较。其实这个移1,也不是不可以但是比起移那个数,还是要难一些。我们移1之后就表示判断结果等于1了,而是等不等于0,如果等于0,那么就没有1,如果不等于0,那么就有1。原因我就用图来表述了:

以上就是全部的思路,接下来就用代码演示:

移输入数的位

#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);int count = 0;int i = 0;for (i = 1; i <= 32; i++){if (n & 1 == 1){count++;}n >>= 1;//注意这里千万不能是移i位,因为i的数字是不断增加的,而不是定值。}printf("%d\n", count);return 0;
}
#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);int count = 0;int i = 0;for (i = 0; i < 32; i++){if ((n >> i) & 1 == 1){count++;}}printf("%d\n", count);return 0;
}

 上面这两种写法都是可以的。

移 1 的位 

#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);int count = 0;int i = 0;for (i = 0; i < 32; i++){if ((n & (1 << i)) != 0){count++;}}printf("%d\n", count);return 0;
}

上面这个题目其实还能优化(属于大佬能想到的)

我就先把代码演示一下:

#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);int count = 0;while (n){n = n & (n - 1);count++;}printf("%d\n", count);return 0;
}

这个代码最难理解的就是那个 n = n & (n-1)。这个表达式可以把从右往左把最左边的1给去掉。

画图演示: 

这个代码其实算法的体现是比较明显了 ,一般不容易想到。

 二进制位置0或者置1

 编写代码将n的二进制序列的第5位(从右往左的第5位)(假设第5位是0)修改为1,然后再改回0。

这个题目应该是相较前面的难度要少一点。其实我们只要在第5位异或(^)一个1,就可以了。利用异或的规则:相异为1。至于这个第5位的1是怎么来实现呢?我们只需要讲1向移4位就够了。第二部,就在第5位按位异或(^)上一个1,就可以了。因为我们前面改了第5位的数变成了1,异或相同为0。

代码实现:

#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);n ^= (1 << 4);printf("%d\n", n);n ^= (1 << 4);printf("%d\n", n);return 0;
}

代码演示: 

我们上面就举了个最简单的例子0,任何一位都没有1,第5位改了之后就变成了2的4次方,等于16,第二次我们又改回来了,变成了0。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云部署配置幻兽帕鲁Palworld联机服务器详细教程

阿里云作为国内领先的云计算服务提供商&#xff0c;为企业和个人提供了丰富的云服务。本文将为大家详细介绍如何在阿里云上配置幻兽帕鲁Palworld联机服务器&#xff0c;以便与更多玩家共同体验游戏的乐趣。 第一步&#xff1a;登录服务器创建页 1、进入幻兽帕鲁联机服务快速部…

11. 双目视觉之立体视觉基础

目录 1. 深度恢复1.1 单目相机缺少深度信息1.2 如何恢复场景深度&#xff1f;1.3 深度恢复的思路 2. 对极几何约束2.1 直观感受2.2 数学上的描述 1. 深度恢复 1.1 单目相机缺少深度信息 之前学习过相机模型&#xff0c;最经典的就是小孔成像模型。我们知道相机通过小孔成像模…

力扣LCR 180. 文件组合(双指针)

Problem: LCR 180. 文件组合 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 本题目可以利用滑动窗口的技巧&#xff08;滑动窗口就是双指针的运用&#xff09;解决&#xff0c;具体实现如下 1.逻辑上生成窗口&#xff1a;让两个指针i&#xff0c;j分别初始化为1…

Java基本数据类型-字符型,布尔型

目录 字符型转义字符实例运行结果 ASCII码实例运行结果 布尔型实例运行结果 字符型 Java中使用单引号来表示字符常量&#xff0c;字符型在内存中占2个字节。char 类型用来表示在Unicode编码表中的字符。Unicode编码被设计用来处理各种语言的文字&#xff0c;它占2个字节&#…

3DGS 其二:Street Gaussians for Modeling Dynamic Urban Scenes

3DGS 其二&#xff1a;Street Gaussians for Modeling Dynamic Urban Scenes 1. 背景介绍1.1 静态场景建模1.2 动态场景建模 2. 算法2.1 背景模型2.2 目标模型 3. 训练3.1 跟踪优化 4. 下游任务 Reference&#xff1a; Street Gaussians for Modeling Dynamic Urban Scenes 1.…

Linux——常用命令

1、命令的基本格式 对服务器来讲&#xff0c;图形界面会占用更多的系统资源&#xff0c;而且会安装更多的服务、开放更多的端口&#xff0c;这对服务器的稳定性和安全性都有负面影响。其实&#xff0c;服务器是一个连显示器都没有的家伙&#xff0c;要图形界面干什么&#xff…

力扣hot100 字符串解码 栈 辅助栈

Problem: 394. 字符串解码 文章目录 思路&#x1f496; 辅助栈 思路 &#x1f468;‍&#x1f3eb; 路飞 &#x1f496; 辅助栈 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) class Solution {public String decodeString(String s…

MCU启动文件小解一下

GD32启动文件分析 启动文件的一些指令.s启动文件分析栈空间分配堆空间管理中断向量表定义堆空间定义Reset_Handler复位程序HardFault_Handler_main文件分析用户堆栈初始化 GD32启动文件主要做了以下工作&#xff1a; 初始化SP_initial_sp , PCReset_Handler指针&#xff0c;设置…

C#,计算几何,随机点集之三角剖分的德劳内(Delaunay)算法的源代码

一、三角剖分Delaunay算法简介 点集的三角剖分&#xff08;Triangulation&#xff09;&#xff0c;对数值分析&#xff08;比如有限元分析&#xff09;以及图形学来说&#xff0c;都是极为重要的一项预处理技术。尤其是Delaunay三角剖分&#xff0c;由于其独特性&#xff0c;关…

day04 两两交换链表中的节点、删除链表倒数第N个节点、链表相交、环形链表II

题目链接&#xff1a;leetcode24-两两交换链表中的节点, leetcode19-删除链表倒数第N个节点, leetcode160-链表相交, leetcode142-环形链表II 两两交换链表中的节点 基础题没有什么技巧 解题思路见代码注释 时间复杂度: O(n) 空间复杂度: O(1) Go func swapPairs(head *Li…

class_19:抽象类(纯虚函数不能被实例化)

#include <iostream>using namespace std;class Teacher{ public:string name;string school;virtual void goinclass() 0;//纯虚函数不能被实例化 抽象类virtual void startclass() 0;//纯虚函数不能被实例化virtual void afterclass() 0;//纯虚函数不能被实例化 };…

Android App开发-简单控件(4)——按钮触控和图像显示

3.4 按钮触控 本节介绍了按钮控件的常见用法&#xff0c;包括&#xff1a;如何设置大小写属性与点击属性&#xff0c;如何响应按钮的点击事件和长按事件&#xff0c;如何禁用按钮又该如何启用按钮&#xff0c;等等。 3.4.1 按钮控件Button 除了文本视图之外&#xff0c;按钮…

IMXULL驱动学习——通过总线设备驱动模型点亮野火开发板小灯【参考韦东山老师教程】

参考&#xff1a;【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想&#xff08;学习设备树过渡部分&#xff09;-CSDN博客 韦东山课程&#xff1a;LED模板驱动程序的改造_总线设备驱动模型 我使用的开发板&#xff1a;野火imx6ull pro 欢迎大家一起讨论学习 实现了总线设…

【探索科技 感知未来】文心一言大模型

【探索科技 感知未来】文心大模型 &#x1f6a9;本文介绍 文心一言大模型是由中国科技巨头百度公司研发的一款大规模语言模型&#xff0c;其基于先进的深度学习技术和海量数据训练而成。这款大模型具备强大的自然语言处理能力&#xff0c;可以理解并生成自然语言&#xff0c;为…

leetcode hot100岛屿数量

本题中要求统计岛屿数量&#xff08;数字1的上下左右均为1&#xff0c;则是连续的1&#xff0c;称为一块岛屿&#xff09;。那么这种类型题都是需要依靠深度优先搜索&#xff08;DFS&#xff09;或者广度优先搜索&#xff08;BFS&#xff09;来做的。这两种搜索&#xff0c;实际…

蓝牙----蓝牙GAP层

蓝牙协议栈----GAP GAP的角色连接过程连接参数 GAP&#xff1a;通用访问配置协议层 gap的角色发现的模式与过程连接模式与过程安全模式与过程 CC2640R2F的GAP层抽象 GAP的角色 Broadcaster 广播电台 -不可连接的广播者。Observer 观察者 -扫描广播者但无法启动连接。Periphe…

降低文件增长和失真的零系数JPEG图像可逆信息隐藏

一、研究概述和意义 随着多媒体技术和网络的迅猛发展&#xff0c;数字媒体的应用越来越广泛。在网络上传输的数字 媒体如音频、文本、视频和图像的内容及数据安全问题也随之而来。伴随着计算机技术发展与普及&#xff0c;数字媒体的机密性、完整性经常受到非法活动的威胁&…

vue中的computed

目录 一&#xff1a;介绍 二&#xff1a;例子演示 一&#xff1a;介绍 在 Vue.js 中&#xff0c;computed 属性是一种特殊类型的属性&#xff0c;它允许你声明依赖于其他数据属性的值。computed 属性的值是通过一个函数计算得出的&#xff0c;这个函数可以在其依赖的数据发生…

深入理解stressapptest

文章目录 一、概述二、安装2.1、源码编译安装2.2、命令行安装2.3、安装确认三、重要参数详解3.1、查询支持的参数3.2、参数说明 四、实例4.1、随机测试&#xff08;默认模式&#xff09;4.2、循环测试4.2、全内存测试 团队博客: 汽车电子社区 一、概述 stressapptest是一款免费…

HCIA-HarmonyOS设备开发认证-2.设备开发入门

目录 HarmonyOS设备开发学习路径一、开发项目与工具介绍1.1、设备开发环境准备1.2、设备开发流程1.3、Huawei DevEco Device Tool 二、OpenHarmony介绍OpenHarmony目录结构详细介绍applications目录详解base目录详解foundation目录详解 OpenHarmony接口分层介绍CMSIS 和 POSIX …