利用操作符解题的精彩瞬间

news2024/9/21 20:27:07

下面是链接为了解释练习2的并且还有与操作符相关的知识。 

C语言与操作符相关的经典例题-CSDN博客

操作符详解(上)-CSDN博客

操作符详解(下)-CSDN博客

目录

练习1:在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。

练习2:两个整数二进制位不同个数

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


前言:有些题目可能我们想破脑袋也不知道怎么写,但是如果用一些看似奇怪的方法去写,就能有一种柳暗花明又一村的感觉。虽然这些代码是那些大牛想到的,但是只要我们坚持看这些大牛的代码,我们总可以多学到一点。(个人感想,可忽略。

步入正题:

练习1:在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。

这个题目是关键就是找到那个单独的数字。如果我们能想到用按位异或(^)的方法就比较简单了。

解题的知识储备:0 ^ n = n     n ^ n = 0   。

思路:我们可以先定义一个变量等于0,用它来异或数组里的数。由于0 ^ n = n,所以这个变量不影响最终的求值。(当然这一步如果简化就是把这个变量初始化为数组的第一个元素,而异或开始的是用第二个元素。)用循环产生这些数组的元素,当我们把它们全部异或到一起时,就可以用到n ^ n = 0,这个最终剩下的就是那个单独的数字,也就是我们要找的那个数。

上面这个就是原理图 。之所以可以这样做,是因为异或也满足交换律。

#include <stdio.h>
int FindNumber(int* p, int sz)
{
	int i = 0;
	int flag = 0;
	for (i = 0; i < sz; i++)
	{
		flag ^= *(p + i);
	}
	return flag;
}
int main()
{
	int arr[] = { 1,2,3,4,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = FindNumber(arr, sz);//因为要遍历数组,所以需要数组和数组的元素
	printf("%d\n", ret);
	return 0;
}
#include <stdio.h>
int FindNumber(int* p, int sz)
{
	int i = 0;
	int flag = 1;
	for (i = 1; i < sz; i++)
	{
		flag ^= *(p + i);
	}
	return flag;
}
int main()
{
	int arr[] = { 1,2,3,4,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = FindNumber(arr, sz);//因为要遍历数组,所以需要数组和数组的元素
	printf("%d\n", ret);
	return 0;
}

 第二个代码是用括号内写法的。

代码演示:

练习2:两个整数二进制位不同个数

两个整数二进制位不同个数_牛客题霸_牛客网

题目:

思路:题目是要求输入的两个数,二进制中又多少个比特位不相同。既然是让我们求两个数的二进制位不同个数,这里我们应该就可以联想到一个操作符:按位异或(^),相同的二进制位取0,不同的二进制位取1。我们就可以把这两个数按位异或存放到第三个数中,既然不同的二进制位是1,那么只要我们把这个1的个数统计出来了,也就意味着求出来二进制中不同位的个数了。

#include <stdio.h>
int Num(int c)
{
    int count = 0;
    while(c)
    {
        c = c & (c-1);//这一步如果看不懂的话,可以去看我前面的那一篇关于操作符的文章,我将链接放到文章的最前面了
        count++;
    }
    return count;
}
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d%d",&a,&b);
    int c = a ^ b;
    int ret = Num(c);//求二进制中一的个数(用函数来实现)
    printf("%d\n",ret);
    return 0;
}

之所以用函数的方法,是因为不想让这个主函数看起来很长,这样会影响代码的美观。

按位异或的思想其实就是在找不同,如果想要找到不同的地方,就可以使用按位异或的方法。

这个就类似题眼。

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

这个题目其实就是在变相的问一个整数二进制的0和1的个数并且按照奇偶打印出来。因为一个整数的二进制位要么是0,要么是1。那么我们怎么知道这个整数的二进制位是0还是1呢?这里就可以用按位与(&)来计算,当我们按位与上一个1是,如果这个位是0,那么最终的结果就是0;如果这个位是1,那么最终的结果就是1。这是第一位的结果,我们要的是32个位,那么就循环32次。我们只要分奇偶来按位与,并且输出就可以了。接下来,就是要分奇偶来讨论了。讨论奇数的时候怎么循环?偶数的时候怎么循环?我就用画图来描述:

根据8位,我们就可以推出32位的循环结果。如果i从0开始,那么结束的位置就都要减1。因为开始是0。

 代码演示:

#include <stdio.h>
void Get(int n)
{
	int i = 0;
	printf("奇数位:");
	for (i = 0; i < 31; i += 2)//打印奇数位
	{
		if (((n >> i) & 1) == 1)
		{
			printf("%d ", 1);
		}
		else
		{
			printf("%d ", 0);
		}
	}
	printf("\n");
	printf("偶数位:");
	for (i = 1; i < 32; i += 2)//打印偶数位
	{
		if (((n >> i) & 1) == 1)
		{
			printf("%d ", 1);
		}
		else
		{
			printf("%d ", 0);
		}
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Get(n);
	return 0;
}

其实这个还可以简化一点,既然 ((n >> i) & 1)的结果是1,就打印1;结果是0,就打印0。那么我们就直接把这个表达式当作是printf的参数就更好了。

#include <stdio.h>
void Get(int n)
{
	int i = 0;
	printf("奇数位:");
	for (i = 0; i < 31; i += 2)
	{
		printf("%d ", (n >> i) & 1);
	}
	printf("\n");
	printf("偶数位:");
	for (i = 1; i < 32; i += 2)
	{
		printf("%d ", (n >> i) & 1);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Get(n);
	return 0;
}

但是这里有的小伙伴可能会将1的位数给移动,因为移动1的位数相对比较简单。但是这个题目狡猾就狡猾在这里。你移动了那个位数之后,虽然比较出来的结果是1,但是它的权重变了,不再是2的0次方,而是2的1次方,2的2次方等等。这样写出来的程序就输出的不是1了。

#include <stdio.h>
void Get(int n)
{
	int i = 0;
	printf("奇数位:");
	for (i = 0; i < 31; i += 2)//打印奇数位
	{
		printf("%d ", n & (1 << i));
	}
	printf("\n");
	printf("偶数位:");
	for (i = 1; i < 32; i += 2)//打印偶数位
	{
		printf("%d ", n & (1 << i));
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Get(n);
	return 0;
}

我们输入的是7,输出的却是1,2,4,但是我们会发现两者之和相等。这就是因为权重的问题。 

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

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

相关文章

化工企业能源在线监测管理系统,能源管理新利器

化工企业在开展化工生产活动时&#xff0c;能源消耗量较大&#xff0c;其节能潜力空间也较大&#xff0c;因此必须控制能耗强度&#xff0c;促进能效水平的稳步提升。化工企业通过能源现状的分析&#xff0c;能够实现能源使用情况的实时反馈与监管&#xff0c;从而达到节能减排…

铸就企业品牌之道之软文发稿

企业品牌是企业在市场中的独特身份&#xff0c;通过标志、名称和视觉元素等构建&#xff0c;为企业赋予个性和识别度。品牌不仅是产品和服务的代名词&#xff0c;更是传递价值观、建立信任和塑造企业形象的关键工具。成功的品牌能够吸引目标受众&#xff0c;建立稳固的市场地位…

[AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

【leetcode题解C++】257.二叉树的所有路径 and 404.左叶子之和 and 112.路径总和

257. 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5",&…

【通信系统】MIMO阵列信号来向DOA估计实现~含FOCUSS、OMP、贝叶斯学习(SBL)等稀疏重构法和常规、子空间法、空间平滑滤波法

MIMO阵列目标信号来向估计原理与实现~基于常规法、子空间变换法和稀疏恢复法 写在最前前言空间谱估计的历史发展 仿真原理离散时间阵列信号模型波束形成矩阵(完备字典)回波生成空间平滑滤波传统方法CBF~常规波束成型Capon~最小方差无失真响应法ML~最大似然估计法 子空间方法MUS…

安卓主板_紫光展锐T820安卓主板方案定制

安卓主板采用了性能强劲的紫光展锐T820八核处理器&#xff0c;搭载了Android 13系统&#xff0c;为用户带来更加顺畅的操作体验。该主板不仅采用了6nm工艺&#xff0c;更加强大的算力和优越的性能&#xff0c;能够轻松实现多任务运行&#xff0c;不会出现卡顿现象。 此外&#…

04:容器技术概述|镜像与容器|docker配置管理

容器技术概述&#xff5c;镜像与容器&#xff5c;docker配置管理 什么是容器优点缺点 docker与容器跳板机yum源添加docker软件在node节点验证软件包开启路由转发 镜像管理&容器管理如何获取镜像镜像备份与恢复运行容器查看镜像的启动信息镜像管理命令容器管理命令容器内部署…

用C#实现最小二乘法(用OxyPlot绘图)

最小二乘法介绍✨ 最小二乘法&#xff08;Least Squares Method&#xff09;是一种常见的数学优化技术&#xff0c;广泛应用于数据拟合、回归分析和参数估计等领域。其目标是通过最小化残差平方和来找到一组参数&#xff0c;使得模型预测值与观测值之间的差异最小化。 最小二…

2023年春秋杯网络安全联赛冬季赛_做题记录

可信计算 基于挑战码的双向认证1 可信计算赛题-双向认证挑战模式.docx 使用命令进行SSH登录上去 ssh player8.147.131.156 -p 18341 # 记得加上-p参数指定端口&#xff0c;不然默认的是22端口看见word文档的提示&#xff0c;先尝试一下 直接获得了flag1 web 魔术方…

public class和class的区别

不用public修饰的类 一个Java源文件中可以定义多个不用public修饰的class&#xff0c;且类名不用和java源文件名一致。public修饰的类可以没有。编译之后&#xff0c;一个class就会对应生成一个class字节码文件 对于用public修饰的类 如果一个类用了public修饰&#xff0c;那…

成功解决Error:AttributeError: module ‘numpy‘ has no attribute ‘long‘.

成功解决Error&#xff1a;AttributeError: module ‘numpy‘ has no attribute ‘long‘. &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;报错分析&#x1f333;&#x1f333;解决方案1&#xff1a;降低NumPy版本&#x1f333;&#x1f333…

Github 上传项目(个人令牌token)

1.点击 github头像 &#xff1a; setting -> Developer Settings -> Personal access tokens 2.在要上传的文件夹下运行以下命令&#xff1a; git init git commit -m "first commit" git branch -M main 利用以下命令模…

使用流服务器m7s对接gb28181

优&#xff1a;sip品牌兼容性比较好&#xff0c;大华&#xff0c;海康都稳定可以&#xff0c;srs的5.0 sip品牌兼容性大华没反应&#xff0c;akstream-sip 大华也有问题&#xff0c;wvp也还可以 缺&#xff1a;目前最新的4.7.4版本&#xff0c;&#xff0c;sip协议用udp正常&a…

IP 层转发分组的过程

目录 IP 层转发分组的过程 1.1 基于终点的转发 1.2 最长前缀匹配 转发表中的 2 种特殊的路由 主机路由 (host route) 默认路由 (default route) 路由器分组转发算法 1.3 使用二叉线索查找转发表 IP 层转发分组的过程 1.1 基于终点的转发 分组在互联网中是逐跳转发的。…

Angular组件(二) 分割面板ShrinkSplitter

Angular组件(二) 分割面板ShrinkSplitter 前言 在Angular组件(一) 分割面板ShrinkSplitter文章中我们实现了Splitter组件&#xff0c;后来在业务场景中发现在开关右侧容器和底部容器时&#xff0c;使用起来不方便&#xff0c;ngModel绑定的值始终是左侧容器和顶部容器的大小&…

电路分享 —— 单片机 1个IO口检测多路按键

一、设计要求 设计要求&#xff1a;因为单片机的IO口数量较少&#xff0c;要求使用1路IO口检测4路按键。 二、设计思路 设计思路&#xff1a;单片机的IO口数量较少的情况下&#xff0c;使用1路IO口检测4路按键&#xff0c;可以通过检测电压值来进行区分&#xff0c;即使用IO口…

如何纯前端实现文件下载

业务场景 有一个下载文件的功能&#xff0c;不引入后端资源&#xff0c;纯前端应该如何实现&#xff1f; 解决方案 在vue2或者vue3项目中&#xff0c;可以把文件放在 public 文件夹下&#xff0c;然后使用a标签进行文件下载。 如&#xff1a;我要下载的文件是模版.xlsx 。首…

STM32学习笔记二——STM32时钟源时钟树

目录 STM32芯片内部系统架构详细讲解&#xff1a; 1.芯片内部混乱电信号解决方案&#xff1a; 2.时钟树&#xff1a; 1.内部RC振荡器与外部晶振的选择 2. STM32 时钟源 3.STM32中几个与时钟相关的概念 4.时钟输出的使能及其流程 5.时钟设置的基本流程 时钟源——单片机…

应用下载页源码简洁高大尚下载单页

首先可以设置多个下载源 软件截图可以滚动 暗夜主题交换 图片都可以自定义配置 精美的页面会让你眼前一亮的 源代码学习资料&#xff1a;https://pan.baidu.com/s/1ulE9zde2XMs-6E7eF3D3kg?pwdfhxq 密码&#xff1a;123

1178:单词数

题目描述 统计一篇文章里不同单词的总数。 输入 有多组数据&#xff0c;每组一行&#xff0c;每组就是一篇小文章。每篇小文章都是由大小写字母和空格组成&#xff0c;没有标点符号&#xff0c;遇到#时表示输入结束。每篇文章的单词数小于1000&#xff0c;每个单词最多由30个…