【C语言】位操作符的一些题目与技巧
初学者在学完位操作符之后,总是不能很好的掌握,因此这篇文章旨在巩固对位操作符的理解与使用。
有的题目可能会比较难以接受,但是看完一定会有收获
目录
- 位操作符:
- 一些题目:
- 不创建临时变量交换整数
- 整数转换
- 二进制中1的个数
- 不用加减乘除实现加法
- 寻找奇数
- 错误的集合(必看)
- 小技巧:
- 总结:
位操作符:
开始之前,先来了解一下位操作符
&按位与,只有两个数
同时为真才为真,否则为假
| 按位或,只有两个数同时为假才为假,否则为真
^按位异或,两个数相同为0,不同为0
- 例子:
- 按位与:
- 按位或:
- 按位异或:
一些题目:
题目大都来自牛客与力扣,虽然不能很好的囊括位操作符的全部,但是可以很好的加深理解。
一一一一一一一一一一一一一一分割线一一一一一一一一一一一一一一
不创建临时变量交换整数
注意:此题无链接
不能创建临时变量(第三个变量),实现两个数的交换。
a=10
;b=20
;
做这题首先要知道:
位操作符
支持交换律
且num^num=0
,0^num=num
那么我们就可以解决这道题
先来看代码实现,方便理解思路
代码实现:
#include <stdio.h>
int main()
{int a = 10;int b = 20;a = a^b;b = a^b;a = a^b;printf("a = %d b = %d\n", a, b);return 0;
}
思路:
将
a = a^b
的a带入b = a^b
中的a,即b=a^b^b
,则b=10
b = a^b
的b带入a =a^b
中的b,即a=a^a^b
,则a=20
一一一一一一一一一一一一一一分割线一一一一一一一一一一一一一一
整数转换
整数转换,链接奉上
思路:
首先我们要知道,
num & 1
为最后一位二进制的数字,
那我们使用移位操作符遍历一下整数的32位比特位
就迎刃而解
代码实现:
int convertInteger(int A, int B)
{int count=0;//创建计数器int i=0;for(i=0;i<32;i++){if((A>>i&1)!=(B>>i&1))count++;}return count;
}
一一一一一一一一一一一一一一分割线一一一一一一一一一一一一一一
二进制中1的个数
注意:此题无链接
这题和上一题大同小异,都可以使用
位移操作符与位操作符遍历
解决,但这种方法必须循环32次
(整形情况下)才能得到结果
还有一种方法:
使用
num&(num-1)
,这个式子的意义是什么呢?
是将式子最右边的1
消掉
举个例子:
while(num)
{num&(num-1);
}
//假设在while循环中,设num为15,那么二进制就为11111111 num1110 num-11110 新的num1101 num-11100 新的num1011 num-11000 新的num0111 num-10000 新的num
可以看到,当
num为0时
循环停止,循环了4
次,也就是1
的个数
我们就可以使用这种方法做题
思路:
使用
num&(num-1)
计算二进制1的个数
代码实现:
#include <stdio.h>
int main()
{int num = -1;int i = 0;int count = 0;//计数while(num){count++;num = num&(num-1);}printf("二进制中1的个数 = %d\n",count);return 0;
}
一一一一一一一一一一一一一一分割线一一一一一一一一一一一一一一
不用加减乘除实现加法
不用加减乘除做加法,链接奉上
按位异或其实有个别名,叫做不进位加法
,什么意思呢?
就是可以计算不进位的加法
例如:
int a=10;
//0000 1010
int b=20;
//0001 0100
int sum=a^b;
//0001 1110也就是30,
//我们发现当没有进位时,按位异或可以代替加法,那么有进位怎么办呢?
不过我们要想解决这个题,仅仅知道不进位加法是不够的,
我们从10进制
举例
计算12+9
:
1.
1+0=0,2+9=1
(先不计算进位),结果为11
2.2+9
有进位,进位为10
3.两者相加:10+11=21
既然如此,我们也可以利用这种方法计算,那进位如何表示呢?
二进制中只有两个1
才会进位,因此我们按位与两个要相加的数
,再进行左移
就可以模拟进位。
思路:
1.将两个
要相加的数字按位异或
2.将两个数字进行按位与并向左移1位
计算出进位
3.将两数相加
,此时只需重复上述两个步骤,直到进位为0。
代码实现:
int Add(int num1, int num2 )
{int sum=0;int forward=0;do{sum=num1^num2;forward=(num1&num2)<<1;num1=sum;//num1与num2顺序不重要num2=forward;}while(forward);return sum;
}
一一一一一一一一一一一一一一分割线一一一一一一一一一一一一一一
寻找奇数
寻找奇数,链接奉上
思路:
在不创建临时变量交换整数,
我们了解了num^num=0
,0^num=num
,那我们这题就可以使用这种方法
#include <stdio.h>
#include<stdlib.h>int main()
{int n=0;scanf("%d",&n);int arr[n];//由编译器决定是否支持加长数组,//牛客网支持,也可以不使用加长数组//根据题目条件选择合适的个数范围int ans=0;for(int i=0;i<n;i++){scanf("%d",&arr[i]);ans^=arr[i];}printf("%d",ans);return 0;
}
一一一一一一一一一一一一一一分割线一一一一一一一一一一一一一一
错误的集合(必看)
错误的集合,链接奉上
思路:
我们发现,重复的数字与消失的数字出现的次数都是偶数次(2和0次)
,其他的数字出现次数是奇数次(1次)
,此时我们可以多添加
一个从1~n
正确的数字集合,使重复的数字与缺失的数字为奇数次
(3和1次),其他的数字出现次数为偶数次
(2次),我们利用异或
就可以比较好的解决
设x,y分
别为重复的数字与消失的数字,将2n
个数字按位异或在一起,因为num^num=0
,0^num=num
,结果为x^y
,我们记为xor
因为x!=y
,故xor不为0
,我们此时令lowbit=xor&(-xor)
,这是为了取得x与y最低位不同比特位
(其实只要是不同的就可以,只是最低位好获得),简单的解释一下:
当x与y有最低位bit位不同时时,当前位异或的结果为1,那我们如何找到这个1呢
使用lowbit=xor&(-xor)
例如:
0000 1010
10的补码
1111 0110
-10的补码
0000 0010
按位与得到最低位不同比特位
得到lowbit
后,将2n
个数字分成两组
,第一组每个数字a
都满足a&lowbit==0
,第二组每个数字b
满足b&lowbit!=0
创建个2个变量,num1与num2,将第一组的a按位与在一起赋值给num1
,另一组同样赋值给num2,此时num1与num2就是x或y
,因为相同的数字肯定在一组,并且除了x与y出现的次数都是偶数次,故得到num1与num2就是x或y
此时将x与nums数组遍历比较一遍
,如果出现即为消失的数字
,否则相反。
代码实现:
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{static int arr[2];int xor=0;for(int i=1;i<=numsSize;i++){xor^=nums[i-1];xor^=i;}//得到x^yint lowbit=xor&(-xor);//得到最低位比特位int num1=0;int num2=0;for(int i=0;i<numsSize;i++)//分组nums数组{if((nums[i]&lowbit)==0)num1^=nums[i];elsenum2^=nums[i];}for(int i=1;i<=numsSize;i++)//分组添加的数字{if((i&lowbit)==0)num1^=i;elsenum2^=i;}int count=0;//计数器int i=0;for(i=0;i<numsSize;i++){if(nums[i]==num1)count++;}if(count==0){arr[1]=num1;arr[0]=num2;}else{arr[1]=num2;arr[0]=num1;}*returnSize=2;return arr;
}
小技巧:
一些位运算中的简便运算
1.
x & 1
是奇数返回1
,是偶数返回零,可以放在if中判断奇偶
2.x |= 1<<j
等价于x += pow(2,j)
;
3.x<<2 x<<1
,在十进制中表现的是乘上2的多少次方,在二进制中,就是先将这个x转换为二进制,然后整个数往前移位。(最后转化回去还是一样的)
4.num^num=0
,0^num=num
,异或也叫xor
总结:
在遇到数字重复时,二进制时,计算时,可能会有操作符的做法
遇到不会做的题很正常,不要感到沮丧,要知道我们也是站在巨人的肩膀上才能看得更远
相关文章:
【C语言】位操作符的一些题目与技巧
初学者在学完位操作符之后,总是不能很好的掌握,因此这篇文章旨在巩固对位操作符的理解与使用。 有的题目可能会比较难以接受,但是看完一定会有收获 目录 位操作符:一些题目:不创建临时变量交换整数整数转换二进制中1的…...
爬虫逆向实战(二十二)--某恩数据电影票房
一、数据接口分析 主页地址:某恩数据 1、抓包 通过抓包可以发现数据接口是API/GetData.ashx 2、判断是否有加密参数 请求参数是否加密? 无请求头是否加密? 无响应是否加密? 通过查看“响应”模块可以发现,响应是…...
火山引擎发布自研视频编解码芯片
2023年8月22日,火山引擎视频云宣布其自研的视频编解码芯片已成功出片。经验证,该芯片的视频压缩效率相比行业主流硬件编码器可提升30%以上,未来将服务于抖音、西瓜视频等视频业务,并将通过火山引擎视频云开放给企业客户。 火山引…...
投递技术类简历的注意事项
简历修改的背景 作为程序员,随着工作年限的增加,要定期的去修改自己的简历中的工作项目,一方面可以促进自己复盘一下工作成果和个人成长,另外也能给自己换工作提供一个前置的便捷性。 注意事项 修改简历的时候有哪些需要注意的…...
每日一题——柱状图中最大的矩形
柱状图中最大的矩形 题目链接 用什么数据结构? 要得到柱状图中最大的矩形,我们就必须要知道对于每一个高度heights[i],他所能勾勒出的矩形最大是多少(即宽度最大是多少)。 而对应到图上我们可以知道,要知…...
Banana Pi推出基于龙芯2K1000LA处理器的信创工业控制开发平台
Banana Pi推出基于龙芯2K1000LA处理器的信创工业控制开发平台:BPI-5202信创工业控制开发平台 BPI-5202 龙芯2K1000LA 信创工业控制开发平台 1.1 工控机的应用场景 物联网的狂潮,既是一场众多的计算机软硬件厂家(也包括通讯方案和产品厂家&…...
springCloud整合Zookeeper的时候调用找不到服务
SpringCloud整合Zookeeper的时候调用找不到服务 首先,我们在注册中心注册了这个服务: 然后我们使用RestTemplate 调用的时候发现失败了:找不到这个服务: 找了很多资料发现这个必须要加上负载才行 BeanLoadBalanced //负载publi…...
【kubernetes】使用kubepshere部署中间件服务
KubeSphere部署中间件服务 入门使用KubeSphere部署单机版MySQL、Redis、RabbitMQ 记录一下搭建过程 (内容学习于尚硅谷云原生课程) 环境准备 VMware虚拟机k8s集群,一主两从,master也作为工作节点;KubeSphere k8skubesphere devops比较占用磁…...
如何从tabbar页面传数据
无论是百度小程序还是微信小程序,app.json中规定的tabbar页面是不支持传参的,例如: <navigator url../service/service?typeid6 openType"switchTab"> 服务项目 </navigator> 上面的navigater跳转有个属性&#…...
软考高级系统架构设计师系列论文七十四:基于构件的软件开发
软考高级系统架构设计师系列论文七十四:基于构件的软件开发 一、构件相关知识点二、摘要三、正文四、总结一、构件相关知识点 软考高级系统架构设计师系列之:面向构件的软件设计,构件平台与典型架构...
图为科技_边缘计算在智能安防领域的作用
边缘计算在智能安防领域发挥着重要的作用。智能安防系统通常需要处理大量的图像、视频和传感器数据,并对其进行实时分析和处理。边缘计算可以将计算和数据处理功能移动到离数据源更接近的地方,例如摄像头、传感器设备或安防终端。 以下是边缘计算在智能…...
Android 13 - Media框架(7)- NuPlayer::Source
Source 在播放器中起着拉流(Streaming)和解复用(demux)的作用,Source 设计的好坏直接影响到播放器的基础功能,我们这一节将会了解 NuPlayer 中的通用 Source(GenericSource)关注本地…...
MySql015——使用子查询
一、创建customers表 ######################## # Create customers table ######################## use study;CREATE TABLE customers (cust_id int NOT NULL AUTO_INCREMENT,cust_name char(50) NOT NULL ,cust_address char(50) NULL ,cust_city char…...
leetcode 355 设计推特
用链表存储用户发送的每一个推特,用堆获取最先的10条动态 class Twitter {Map<Integer,Set<Integer>> followMap;//规定最新的放到最后Map<Integer,Tweet> postMap;//优先队列(堆)PriorityQueue<Tweet> priorityQueue;int time…...
倒数 2 周|期待 2023 Google开发者大会
9 月 6-7 日,中国上海 前沿科技,新知同享 趣味体验,灵感齐聚 技术生态,多元共进 关注官网最新信息,敬请期待大会开幕 2023 Google 开发者大会官网 相信你一定记得,在今年 5 月的 Google I/O 大会上&am…...
代码随想录day57
516最长回文子序列 class Solution { public:int longestPalindromeSubseq(string s) {vector<vector<int>>dp(s.size(),vector<int>(s.size(),0));for(int i0;i<s.size();i)dp[i][i]1;for(int is.size()-1;i>0;i--){for(int ji1;j<s.size();j){if…...
YOLOv5、v8改进:CrissCrossAttention注意力机制
目录 1.简介 2. yolov5添加方法: 2.1common.py构建CrissCrossAttention模块 2.2yolo.py中注册 CrissCrossAttention模块 2.3修改yaml文件。 1.简介 这是ICCV2019的用于语义分割的论文,可以说和CVPR2019的DANet遥相呼应。 和DANet一样,…...
RabbitMQ特性介绍和使用案例
❤ 作者主页:李奕赫揍小邰的博客 ❀ 个人介绍:大家好,我是李奕赫!( ̄▽ ̄)~* 🍊 记得点赞、收藏、评论⭐️⭐️⭐️ 📣 认真学习!!!🎉🎉 文章目录 RabbitMQ特性…...
Ansible 使用 RHEL 系统角色
安装 RHEL 系统角色软件包,并创建符合以下条件的 playbook /home/greg/ansible/timesync.yml 在所有受管节点上运行 使用 timesync 角色 配置该角色,以使用当前有效的 NTP 提供商 配置该角色,以使用时间服务器 172.25.254.254 配置该角色&am…...
重新认识Android中的线程
线程的几种创建方式 new Thread:可复写Thread#run方法。也可以传递Runnable对象,更加灵活。缺点:缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统的资源导致死机或oom。 new Thread(new…...
前端(十五)——GitHub开源一个react封装的图片预览组件
👵博主:小猫娃来啦 👵文章核心:GitHub开源一个react封装的图片预览组件 文章目录 组件开源代码下载地址运行效果展示实现思路使用思路和api实现的功能数据和入口部分代码展示 组件开源代码下载地址 Gitee:点此跳转下载…...
DELL Power Edge R740 安装 OracleLinux-R7-U9-Server
一、准备好 OracleLinux-R7-U9-Server-x86_64-dvd 安装介子: 二、通过 iDRAC挂dvd 安装介子 三、在 iDRAC 开机控制选择虚拟 CD/DCD/ISO 电源控制选择 复位系统(热启动) 四、进入安装阶段 五、配置时区 六、配置磁盘 七、删除之前的旧分区 …...
深入了解OpenStack:创建定制化QCOW2格式镜像的完全指南
OpenStack 创建自定义的QCOW2格式镜像 前言 建议虚机网络配置为 NAT 或 桥接,因为未来 KVM虚机 需要借助 虚机 的外网能力进行联网安装软件包 虚机在启动前,必须在 VMware Workstation 上为其开启虚拟化引擎 虚拟化 Intel VT-x/EPT 或 AMD-V 安装kvm …...
【Java 中级】一文精通 Spring MVC - 数据格式化器(六)
👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…...
Linux内核学习(十二)—— 页高速缓存和页回写(基于Linux 2.6内核)
目录 一、缓存手段 二、Linux 页高速缓存 三、flusher 线程 Linux 内核实现了一个被叫做页高速缓存(page cache)的磁盘缓存,它主要用来减少对磁盘的 I/O 操作。它是通过把磁盘中的数据缓存到内存中,把对磁盘的访问变为对物理内…...
大数据-玩转数据-Flink窗口函数
一、Flink窗口函数 前面指定了窗口的分配器, 接着我们需要来指定如何计算, 这事由window function来负责. 一旦窗口关闭, window function 去计算处理窗口中的每个元素. window function 可以是ReduceFunction,AggregateFunction,or ProcessWindowFunction中的任意一种. Reduc…...
Docker网络-探索容器网络如何相互通信
当今世界,企业热衷于容器化,这需要强大的网络技能来正确配置容器架构,因此引入了 Docker Networking 的概念。Docker 是一种容器化平台,允许您在独立、轻量级的容器中运行应用程序和服务。Docker 提供了一套强大的网络功能&#x…...
ESP32-CAM模块Arduino环境搭建测试
ESP32-CAM模块Arduino环境搭建测试 一.ESP32OV2640摄像头模块CameraWebServer视频查看 二.测试ESP32-CAM(后续称cam模块)代码是否上传执行成功测试 const int led0 12; const int led1 13;void setup() {// put your setup code here, to run once:pinMode(led0, OUTPUT);pin…...
webassembly001 webassembly简述
WebAssembly 官方地址:https://webassembly.org/相关历史 https://en.wikipedia.org/wiki/WebAssembly https://brendaneich.com/2015/06/from-asm-js-to-webassembly/WebAssembly(缩写为Wasm)是一种基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为编…...
vue 使用C-Lodop打印小票
先从官网下载js文件 https://www.lodop.net/LodopDemo.html 打开安装程序,一直下一步既可,我这边已经安装过就不演示了。 // 引入 import { getLodop } from /utils/CLodopfuncs.js;// 使用 let LODOP getLodop()let Count LODOP.GET_PRINTER_COUNT…...
哈尔滨建设局网站/怎么做网页设计的页面
Linux 有问必答:如何在Perl中捕捉并处理信号 提问: 我需要通过使用Perl的自定义信号处理程序来处理一个中断信号。在一般情况下,我怎么在Perl程序中捕获并处理各种信号(如INT,TERM)? 作为POSIX标准的异步通…...
福田搭建网站费用/宁波seo优化流程
1. 你新到这家公司,公司上下都讲人事部主管是“老板的人”;人事部主管的权利很大,也很有号召力,你调动不了的人和事他都可以调动得了,你明显的感觉到这位主管对你在这家企业的发展是个“绊脚石”。某天&…...
网络营销方式举个例子/温州seo公司
下面介绍无监督机器学习算法,与前面分类回归不一样的是,这个不知道目标变量是什么,这个问题解决的是我们从这些样本中,我们能发现什么。 这下面主要讲述了聚类算法,跟数据挖掘中的关联挖掘中的两个主要算法。 K均值算法…...
网络工作室是什么行业/北京seo分析
文章简介:由浙江卫视和创客星球联合出品、葡萄积木冠名播出的详情>>作者:飞鸟2020-10-28 14:42整理铁甲犀牛多42级后就可以进化了,可以进化为铁详情>>阅读: 8日期: 2020-10-28原标题:铁甲威虫之骑刃王,龙尊…...
什么人最需要建设网站/免费推广seo
以下内容均为微信内置浏览器访问的场景。本文只阐述微信分享的URL的坑,不阐述具体的代码实现和JS-SDK的具体使用。 大家有没有发现,某些网站访问的路径与最终分享的路径不同!对,没错,就是不同。 微信JS-SDK分享的URL有…...
网站找谁做/美国新冠疫情最新消息
Maven 进阶Maven 依赖机制传统方式Maven 的方式解释说明Maven POMPOM 的例子Maven 插件插件类型Maven 快照什么是快照?快照与版本Maven 依赖机制 在 Maven 依赖机制的帮助下自动下载所有必需的依赖库,并保持版本升级。让我们看一个案例研究,…...