移位和位操作符的应用

前言

       这里我将分享几道编程题目,主要使用移位和位操作符进行解答。
       我们首先要知道两个数字进行异或操作的时候结果是位0的,即 a ^ a = 0,并且我们还要知道 0 和任何数字异或的结果都是这个数字的本身,即 0 ^ a = a;

交换变量(一道变态的面试题)

不能创建临时变量(第三个变量),实现两个数的交换

解析

       既然不能创建变量,那么我们可以尝试从位操作符入手,首先 a ^ b 的结果放入 a 中,再异或 b 就会得到原先 a 的值,把异或的结果放入 b 中, a 异或这个 b 的话,就会得到这个 b 的值。

代码实现

#include <stdio.h>int main()
{int a = 5, b = 10;a = a ^ b;   // 注意斜杠后面的 a 和 b 是原先的值b = a ^ b;  // a ^ b ^ b = a ^ 0 = aa = a ^ b;  // a ^ b ^ a = b ^ 0 = bprintf("%d\n%d\n", a, b);return 0;
}

求一个整数储存在内存中二进制中 1 的个数

方法一

       我们可以使用一个 1 进行左移操作,遍历三十二位 (y因为整型是四个字节就是32个比特位),用计数器count 来记录有多少个 1 ,这样就可以了

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

方法二

       我们可以使用一个公式就是 n & (n - 1) , 这个公式能帮我们去掉每一位上的 1 ,这样的话,我们就可以用循环来遍历待测的数字的二进制上的每一位。


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

你们猜猜看为什么我要使用unsigned ,因为害怕整型溢出,很简单如果 n 的二进制位是32个1,是个负数,你减去一就会整型溢出,所以为了避免这一种情况出现,我们使用unsigned 来接受 n 的数值。

二进制某位上置位 0 或 1

将数字13的二进制序列的第五位设置为1,之后再改为0.

解析

       这道题很简单,对 1 进行移位操作,将结果与13 进行a按位或( | )操作即可。再改为 0 也是一样的,就是将 1 移位操作再按位取反加 ( & )操作即可。

代码实现

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

单身狗1

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

例如:

数组中有:1 2 3 4 5 1 2 3 4,只有5出现一次,其他数字都出现2次,找出5

解析

       我们设置一个 tmp 为0,然后用循环来遍历每一个数字与tmp进行异或,最后打印tmp的值就是那个“单身狗”!

代码实现

#include <stdio.h>int main()
{int arr[9] = { 1,2,3,4,5,1,2,3,4 };int sz = sizeof(arr) / sizeof(arr[0]);int i = 0, tmp = 0;for (i = 0; i < sz; i++){tmp ^= arr[i];}printf("%d\n", tmp);return 0;
}

单身狗2

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

编写一个函数找出这两个只出现一次的数字。

例如:

有数组的元素是:1,2,3,4,5,1,2,3,4,6

只有5和6只出现1次,要找出5和6.

解析

       在有了单身狗1 的基础上,我们知道所有数字异或之后就会找到那个落单的数字,但是这道题是有两个落单的数字,那么我们将所有数字进行异或后,得到的结果就是这两个落单的数字异或的结果。既然如此,这个结果能不能进行二次加工来分离这两个数字呢?在二进制的基础上,异或是相同的为0,不同的为1,两个不同的数字必然在某些二进制位是不同的,那么我们就可以将这个结果第几位为 1 作为分界线,来区分这两个数字,我们可以将它们分开来,然后对这两组进行分别异或,就会得到这两个数字。

代码实现

#include <stdio.h>void Find_Single_Dog(int* p, int n, int *num1, int *num2)
{int tmp = 0;int i = 0;for (i = 0; i < n; i++){tmp ^= p[i];}int k = 0;for (i = 0; i < 32; i++)    //找到第几位为1{if (tmp & (1 << i)){break;}}k = i;for (i = 0; i < n; i++){if (p[i] & (i << k)){*num1 ^= p[i];}else{*num2 ^= p[i];}}
}int main()
{int arr[] = { 1,2,3,4,5,1,2,3,4,6 };int sz = sizeof(arr) / sizeof(arr[0]);int num1, num2;num1 = num2 = 0;Find_Single_Dog(arr, sz, &num1, &num2);printf("%d\n%d\n", num1, num2);return 0;
}

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

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

相关文章

24、数据结构/排序相关练习20240206

一、现有无序序列数组为{23,24,12,5,33,5,34,7}&#xff0c;请使用以下排序实现编程。 函数1&#xff1a;请使用冒泡排序实现升序排序 函数2&#xff1a;请使用简单选择排序实现升序排序 函数3&#xff1a;请使用快速排序实现升序排序 函数4&#xff1a;请使用插入排序实现…

粮油蔬菜配送投标书:打造高效供应链的秘诀

在快节奏的现代生活中&#xff0c;粮油蔬菜配送服务的重要性日益凸显。它不仅关系到千家万户的餐桌安全&#xff0c;更是城市高效运转的润滑剂。 1.投标书的“面子”&#xff1a;封面与目录 封面是投标书的第一印象&#xff0c;简洁、专业的设计能够传递出企业的专业性。目录…

记录 | linux下切换python版本

查看系统中存在的 python 版本 ls /usr/bin/python* 查看系统默认的 python 版本 python --version

clickhouse清理日志。

参考Clickhouse&#xff1a;日志表占用大量磁盘空间怎么办&#xff1f;_clickhouse store目录很大-CSDN博客t 清理脚本如下&#xff0c;清理动作需要时间比较长&#xff0c;10多分钟&#xff1a; alter table system.trace_log delete where event_date < 2024-01-01 alt…

【Linux】【开发】Linux内核模块中存在与内核同名的函数引发的问题

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;Linux技术&…

《Git 简易速速上手小册》第3章:分支管理(2024 最新版)

文章目录 3.1 创建与合并分支3.1.1 基础知识讲解3.1.2 重点案例&#xff1a;为 Python 项目添加新功能3.1.3 拓展案例 1&#xff1a;使用 Pull Requests (PRs) 在团队中合作3.1.4 拓展案例 2&#xff1a;解决合并冲突 3.2 分支策略的最佳实践3.2.1 基础知识讲解3.2.2 重点案例&…

比较两次从接口获取的数据,并找出变动的字段

问题&#xff1a;有这么一个接口数据&#xff0c;每次会返回这么一个数据: [{Id:1,pending:65,queued:0,completed:0},{Id:2,pending:0,queued:0,completed:0}]&#xff0c;请问再次请求这个接口的时候如何将获取的数据和上一次获取到的数据进行比较&#xff0c;找出变动的字段…

git合入的parents和child

最近在管理代码&#xff0c;有2的权限&#xff0c;看到一些以前1看不到的东西。 有时候会遇到多个人基于同一节点提交代码&#xff0c;那就要选择先合入和后合入&#xff0c;如果这多人修改到同一个文件同一个地方&#xff0c;就可能产生冲突&#xff0c;一般要避免这种情况出…

Python进阶----在线翻译器(Python3的百度翻译爬虫)

目录 一、此处需要安装第三方库requests: 二、抓包分析及编写Python代码 1、打开百度翻译的官网进行抓包分析。 2、编写请求模块 3、输出我们想要的消息 三、所有代码如下&#xff1a; 一、此处需要安装第三方库requests: 在Pycharm平台终端或者命令提示符窗口中输入以下代…

可解释性AI(XAI)的主要实现方法和研究方向

文章目录 每日一句正能量前言主要实现方法可解释模型模型可解释技术 未来研究方向后记 每日一句正能量 当你还不能对自己说今天学到了什么东西时&#xff0c;你就不要去睡觉。 前言 随着人工智能的迅速发展&#xff0c;越来越多的决策和任务交给了AI系统来完成。然而&#xff…

必看!嵌入式基于UART的通信协议-RS232、RS485协议解析

这两种都是串口通讯的变种&#xff0c;为了提升串口通信的距离和稳定性。通常来说&#xff0c;正常的串口通信使用的是TTL电平&#xff0c;即高电平为2.4-5V&#xff0c;低电平为0-0.4V。高低电平之间的范围很小&#xff0c;如果有静电或者其他外界的干扰&#xff0c;很快会将低…

IEC61499 学习记录

IEC 61499是一种用于工业自动化的标准化模型&#xff0c;它基于面向对象的方法&#xff0c;用于描述分布式控制系统。该模型包括基本元素如事件、函数块和资源&#xff0c;以及它们之间的关系。函数块是该模型的核心概念&#xff0c;它们描述了系统中的控制和数据处理功能。整个…

BT656视频传输标准

前言 凡是做模拟信号采集的&#xff0c;很少不涉及BT.656标准的&#xff0c;因为常见的模拟视频信号采集芯片都支持输出BT.656的数字信号&#xff0c;那么&#xff0c;BT.656到底是何种格式呢&#xff1f; 本文将主要介绍 标准的 8bit BT656&#xff08;4:2:2&#xff09;YCbC…

记一次面试题

1.Php 私有化包&#xff08;composer&#xff09;的部署 1. 创建你的PHP包 确定你的包的功能和命名空间。 创建一个新的目录并初始化一个Git仓库。 使用composer init命令创建一个composer.json文件&#xff0c;并定义你的包名、版本、依赖等信息。 2. 开发并测试你的包 在本地…

Redis与自定义注解实现重复

1、创建 SubmitLock 注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface SubmitLock {String key() default ""; } 2、注解实现 Autowiredpublic RedisUtils redisUtils;Around("execution(* com.example.code_generation…

十分钟掌握前端获取实时数据的三种主流方式

前端获取实时数据的三种主流方式 本文聊聊前端获取实时数据的三种主要方式。想象一下&#xff0c;我们在网上购物时&#xff0c;经常能看到最新的优惠信息弹出&#xff0c;或者在社交媒体上看到朋友的最新动态更新。这些都是因为后端在默默地向我们的页面推送了最新的消息。那…

22.HarmonyOS App(JAVA)位置布局PositionLayout使用方法

不常用 在PositionLayout中&#xff0c;子组件通过指定准确的x/y坐标值在屏幕上显示。(0, 0)为左上角&#xff1b;当向下或向右移动时&#xff0c;坐标值变大&#xff1b;允许组件之间互相重叠 布局方式 PositionLayout以坐标的形式控制组件的显示位置&#xff0c;允许组件相…

【C++】win11,OpenCV安装教程(VS2022)

1.下载 首先进入官网&#xff0c;下载对应的安装包&#xff0c;苹果系统就选IOS pack&#xff0c;微软系统就选Windows 下载地址&#xff1a;Releases - OpenCV 不方便外网下载的话可以下载我分享的百度网盘资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1lV7l…

C语言条件判断:if、else、else if 和 switch 详解

在C语言中&#xff0c;条件判断是一种根据特定条件执行不同代码块的核心机制。为了更好地理解这一概念&#xff0c;本文将深入探讨C语言中的四种主要条件判断结构——if、else、else if和switch&#xff0c;并通过优化变量来展示其实际应用。 1. if 语句 if 语句用于基于某个…

rhel8静态ip配置

1.先cd进来 2.把默认的dhcp改成static IPADDR192.168.211.22 22随意改&#xff0c;255以下的数字都行&#xff0c;1和255不要用 GATEWAY192.168.211.2和虚拟机默认网关保持一致 重启网络 nmcli c reload和 nmcli c up ens160 ping百度测试--&#xff08;成功了&#xff0…