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

下面是链接为了解释练习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,但是我们会发现两者之和相等。这就是因为权重的问题。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多源BFS

AcWing 173. 矩阵距离 #include <bits/stdc.h> using namespace std;const int N 1010; char g[N][N]; int n, m; typedef pair<int, int> PII; int d[N][N]; bool st[N][N];int dx[] {0, 0, 1, -1}; int dy[] {1, -1, 0, 0};void bfs() {queue<PII> q;me…

C#用正则表达式验证格式:电话号码、密码、邮编、手机号码、身份证、指定的小数点后位数、有效月、有效日

正则表达式在程序设计中有着重要的位置&#xff0c;经常被用于处理字符串信息。 用Regex类的IsMatch方法&#xff0c;使用正则表达式可以验证电话号码是否合法。 一、涉及到的知识点 Regex类的IsMatch方法用于指示正则表达式使用pattern参数中指定的正则表达式是否在输入字符串…

redis 极简分布式锁实现

写在前面 工作中遇到&#xff0c;整理 reids 做简单分布式锁的思考博文适合刚接触 redis 的小伙伴理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是…

个人多域名SSL证书推荐

SSL数字证书和通配符SSL证书、多域名通配符SSL证书一样&#xff0c;可以同时保护多个域名站点&#xff0c;但是它们之间还是存在一些区别。其中&#xff0c;最明显的区别就是它们的保护域名网站的类型和适用场景。今天就随SSL盾小编来了解多域名SSL证书。 1.多域名SSL证书可以…

Netty源码三:NioEventLoop创建与run方法

1.入口 会调用到父类SingleThreadEventLoop的构造方法 2.SingleThreadEventLoop 继续调用父类SingleThreadEventExecutor的构造方法 3.SingleThreadEventExecutor 到这里完整的总结一下&#xff1a; 将线程执行器保存到每一个SingleThreadEventExcutor里面去创建了MpscQu…

汽车标定技术(十七)--Bypass的前世今生

目录 1.Bypass的诞生 2.Bypass的发扬光大 2.1 基于XCP的Bypassing 2.2 基于Debug的Bypass 2.3 小结 3.Bypass的实际应用 1.Bypass的诞生 下图我相信只要用过INCA的朋友都非常熟悉。 这是远古时期(2000年左右&#xff1f;我猜)ETAS针对发动机控制参数标定设计的一种并行数据…

【鸿蒙开发】第十二章 Stage模型应用组件-信息传递载体Want

1 概述 上一章节我们学习了UIAbility组件【鸿蒙开发】第十一章 Stage模型应用组件-UIAbility&#xff0c;其中组件间的交互传递信息的媒介就是Want&#xff0c;本章节我们来更加深入学习Want的相关知识。 Want是一种对象&#xff0c;用于在应用组件之间传递信息。 2 类型 显…

【CSS】常见

一. 溢出隐藏 1.1 单行文本溢出 .content{max-width:200px; /* 定义容器最大宽度 */overflow:hidden; /* 隐藏溢出的内容 */text-overflow:ellipsis; /* 溢出部分...表示 */white-space: nowrap; /* 确保文本在一行内显示 */ }问题&#xff1a;display:flex 和 ellipsis 冲…

Centos7安装原生Nginx并配置反向代理

一、背景 当我的应用程序需要集群化部署之时&#xff0c;必然需要一个反向代理&#xff0c;当然Nginx的大名&#xff0c;这里不做更多的介绍了&#xff0c;这里介绍一下Nginx常用的四大阵营 1 Ngnix 原生版本 nginx news 2 Nginx Plus 商用版&#xff08;收费的&#xff09…

【JAVA】Long类型返回到前端,精度丢失

一. 问题阐述 20位long类型的数字&#xff0c;从后端接口返回到前端后【四舍五入】 MYSQL端 &#xff08;1&#xff09;bigint (20) &#xff08;2&#xff09;具体某一条数据 JAVA端 &#xff08;1&#xff09;实体类 &#xff08;2&#xff09;服务类 &#xff08;3&…

传统企业要实现数字化转型,需要从哪些方面入手?

数字化转型是一个综合过程&#xff0c;涉及利用数字技术从根本上改变企业运营方式并为客户提供价值。希望踏上数字化转型之旅的传统企业应考虑几个关键方面&#xff0c;以确保成功、平稳过渡。以下是一些需要开始的基本方面&#xff1a; 1.领导承诺&#xff1a; 自上而下的支…

idea Statistic使用

问题描述&#xff1a;本地idea版本为2018.3.5&#xff0c;安装Statistic插件后没有出现Statistic图标 原因如下&#xff1a;插件版本太新了&#xff0c;需要历史版本 解决办法&#xff1a; IDEA安装代码统计插件Statistic后左下角图标出不来(亲测)_idea statistic不展示-CSD…

20240130在ubuntu20.04.6下卸载NVIDIA显卡的驱动

20240130在ubuntu20.04.6下卸载NVIDIA显卡的驱动 2024/1/30 12:58 缘起&#xff0c;为了在ubuntu20.4.6下使用whisper&#xff0c;以前用的是GTX1080M&#xff0c;装了535的驱动。 现在在PDD拼多多上了入手了一张二手的GTX1080&#xff0c;需要将安装最新的545的驱动程序&#…

老网工秒懂的行业“黑话”,你对齐颗粒度了吗?

你们好&#xff0c;我的网工朋友。 年关将至&#xff0c;多少网工朋友放假了&#xff1f;学技术的心是不是都飘走了。 快过年了&#xff0c;准备和大家聊点有趣、轻松的话题。 前两天部门团建&#xff0c;大家一起去看了年会不能停&#xff0c;挺有意思。 互联网黑话那是一…

解析Kubernets pod DNS域名

k8s dns理解 这个博主讲的很详细 我的这篇文章主要是演示测试 k8s的dns nslookup怎么解析到k8spod域名 创建一个busybox的pod&#xff0c;测试一下pod内是否可以解析 1、流程验证 cat >dns-Deployment.yaml<<EOF apiVersion: apps/v1 kind: Deployment metadata:nam…

PLC找出数据队列里的最大数和最小数所在序号(完整SCL代码)

对于一些需要根据累计运行时间智能启泵和停泵的应用场景,可能会用到此算法,在学习本算法之前,我们需要了解如何在一组数据队列里找出最大数和最小数(这里不涉及排序,只要找到最大数和最小数)。 最大数和最小数搜索FC 请参考下面文章链接: https://rxxw-control.blog.csd…

java+springboot企业员工工作日志审批管理系统ssm+vue

企业OA管理系统具有管理员角色&#xff0c;用户角色&#xff0c;这两个操作权限。 ①管理员 管理员在企业OA管理系统里面查看并管理人事信息&#xff0c;工作审批信息&#xff0c;部门信息&#xff0c;通知公告信息以及内部邮件信息。 管理员功能结构图如下&#xff1a; ide工具…

服务器部署geoserver

linux 进入服务器&#xff0c;创建geoserver文件夹并且解压压缩包 cd /opt mkdir geoserver unzip geoserver-2.19.x-2023-09-22-bin.zip编辑start.ini文件&#xff0c;将port更改为自己的端口 进入bin目录&#xff0c;执行命令包 cd /opt/geoserver/bin ./startup.sh 浏览器…

GoLang和GoLand的安装和配置

1. GoLang 1.1 特点介绍 Go 语言保证了既能达到静态编译语言的安全和性能&#xff0c;又达到了动态语言开发维护的高效率&#xff0c;使用一个表达式来形容 Go 语言&#xff1a;Go C Python , 说明 Go 语言既有 C 静态语言程序的运行速度&#xff0c;又能达到 Python 动态语…

SpringBoot集成MongoDB(3)|(MongoTemplate的List操作)

SpringBoot集成MongoDB&#xff08;3&#xff09;|&#xff08;MongoTemplate的List操作&#xff09; 文章目录 SpringBoot集成MongoDB&#xff08;3&#xff09;|&#xff08;MongoTemplate的List操作&#xff09;[TOC] 前言一、场景说明一、向数组字段添加元素二、从数组中删…