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

下面是链接为了解释练习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.mzph.cn/news/657440.shtml

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

相关文章

Vue学习笔记(二)快速入门

Vue学习笔记&#xff08;二&#xff09;快速入门 vue小试牛刀 hello-vue3.html <body><div id"app"><h1>{{msg}}</h1></div><script type"module">import {createApp} from https://unpkg.com/vue3/dist/vue.esm-b…

超强的AI写简历软件

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…

Opencv——图片卷积

图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二…

颠覆传统楼宇管理,拥抱城市美好生活

智慧楼宇是指通过智能化技术和设备&#xff0c;对楼宇的设施、环境和应用进行全面感知、连接和优化&#xff0c;实现楼宇的智能化、高效化和安全化的建筑。智慧楼宇具有全面感知、实时监控、智能控制、优化管理、节能环保等特点&#xff0c;可以为建筑提供更高效、更便捷、更安…

V90伺服PN总线绝对值编码器点动模式往复运动控制实验(SCL代码)

V90伺服驱动器其它相关介绍,请参考V90控制专栏,常用地址如下: V90 Epos模式下点动控制 https://rxxw-control.blog.csdn.net/article/details/134263795https://rxxw-control.blog.csdn.net/article/details/134263795绝对定位往复运动可以参考下面文章链接: https://rx…

【数据结构 06】二叉树

一、原理 二叉树算法核心思维&#xff1a;递归 满二叉树&#xff1a;二叉树的层数为K&#xff0c;节点数为 完全二叉树&#xff1a;二叉树的层数为K&#xff0c;前K-1层是满的&#xff0c;第K层是连续的 满二叉树是完全二叉树的子集。 任意二叉树&#xff1a;若叶子节点的…

CRF条件随机场学习记录

阅读建议 仔细阅读书[1]对应的序列标注章节&#xff0c;理解该方法面向的问题以及相关背景&#xff0c;然后理解基础的概念。 引言 威胁情报挖掘的相关论文中&#xff0c;均涉及到两部分任务&#xff1a;命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER&a…

android学习笔记----ListView和各种适配器简介

打气筒&#xff08;LayoutInflater对象&#xff09;介绍&#xff1a; MainActivity.java import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import an…

Springboot 实现基于用户和物品的协同过滤算法

目录 简介 协同过滤算法(简称CF) 算法详解 算法使用 基于用户 基于物品 总结 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停…

对作用域链的理解(详细解析)

文章目录 一、作用域全局作用域函数作用域块级作用域 二、词法作用域三、作用域链 一、作用域 作用域&#xff0c;即变量&#xff08;变量作用域又称上下文&#xff09;和函数生效&#xff08;能被访问&#xff09;的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变…

腾讯云部署vue+node项目

文章目录 一、安装宝塔二、vue项目部署三、node项目部署 前言: 关于项目部署,一开始也是找了很多资料,费了点时间,所以记录一下。希望能对各位有所帮助。 一、安装宝塔 1.首先在控制台,进入云服务器的终端界面 2.输入命令和密码获取权限,并且安装宝塔界面 yum install -y w…

腾讯云0基础10秒搭建幻兽帕鲁游戏联机服务器

幻兽帕鲁&#xff08;Palworld&#xff09;是一款多人在线游戏&#xff0c;为了获得更好的游戏体验&#xff0c;需要搭建一个稳定、高效的游戏联机服务器。腾讯云提供了一种简单、快速的方法&#xff0c;让新手小白也能0基础10秒搭建幻兽帕鲁游戏联机服务器&#xff01; 本文将…

计算机网络_1.2因特网概述

1.2因特网概述 一、网络、互联网与因特网的区别与联系1、网络2、互联网3、因特网4、 互联网与因特网辨析 二、因特网介绍1、因特网发展的三个阶段2、因特网简介&#xff08;1&#xff09;因特网服务提供者&#xff08;ISP&#xff09;&#xff08;2&#xff09;因特网已经发展成…

基于Springboot的视频网站系统的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的视频网站系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

ESP8266 传感器搭配 Node-RED实时显示数据,邮件告警 实验

前言 esp8266 12f,wif模块,接倾斜传感器,火焰传感器,烟雾传感器,水浸传感器,蜂鸣器。通过mqtt发布数据,并使用node-red实时获取数据,显示到页面上。并且通过邮件和页面两种方式报警。 需求如下: ①倾斜传感器:监测是否保持平衡。UI界面显示平衡度。如果不平衡,UI界…

Observability:在 Elastic Stack 8.12 中使用 Elastic Agent 性能预设

作者&#xff1a;来自 Elastic Nima Rezainia, Bill Easton 8.12 中 Elastic Agent 性能有了重大改进 最新版本 8.12 标志着 Elastic Agent 和 Beats 调整方面的重大转变。 在此更新中&#xff0c;Elastic 引入了 Performance Presets&#xff0c;旨在简化用户的调整过程并增强…

上位机图像处理和嵌入式模块部署(视频处理vs图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 从目前发展的情况来看&#xff0c;视频处理会慢慢变成一种主流趋势。这里面的原因很多&#xff0c;比如说现在嵌入式soc的算力越来越强、获取图像的…

如何从视频中提取高清图片?可以这样截取

如何从视频中提取高清图片&#xff1f;从视频中提取高清图片可以方便我们制作各种用途所需的素材&#xff0c;如海报、社交媒体配图等。此外&#xff0c;高清图片的细节和色彩也更丰富&#xff0c;可以更好地满足我们的视觉需求。从视频中提取高清图片是一项需要技巧的任务&…

Gateway API 实践之(六)FSM Gateway 的健康检查功能

FSM Gateway 流量管理策略系列&#xff1a; 故障注入黑白名单访问控制限速重试会话保持健康检查负载均衡算法TLS 上游双向 TLS 网关的健康检查功能是一种自动化监控机制&#xff0c;用于定期检查和验证后端服务的健康状况&#xff0c;确保流量只被转发到那些健康且能正常处理请…

Java流程控制for 标签的使用

目录 for语法结构举例breakcontinuereturn 标签 for for循环语句是支持迭代的一种通用结构&#xff0c;是最有效、最灵活的循环结构。for循环在第一次反复之前要进行初始化&#xff0c;即执行初始表达式&#xff1b;随后&#xff0c;对布尔表达式进行判定&#xff0c;若判定结果…