位操作符的应用

news2024/11/24 20:25:49

目录

位操作符的概念:

一、&(按位与):两个整数的补码对应的二进制位有0则为0,两个同时为1才为1,得到的数仍为补码。

二、|(按位或):两个整数的补码对应的二进制位有1则为1,两个同时为0才为0,得到的数仍为补码。

三、^(按位异或):两个整数的补码对应的二进制位相同为0,相异为1,得到的数仍为补码。

位操作符的应用:

一、&(按位与)的应用:

二、^(按位异或)的应用:


位操作符的概念:

位操作符有三种:&(按位与)、|(按位或)、^(按位异或)。

需要注意的是:位操作符的操作数为整数,且具体实现操作的是两个整数的补码


原码、补码、反码的概念:

(1)有符号数的原码、补码、反码分为符号位和数值位两部分,符号位为首位二进制数,0表示正数,1表示负数。

(2)正整数的原码、补码、反码相同

(3)负整数原码为符号位1与对应的数值位组成;反码为原码的符号位不变,其它位次按位取反(0变为1,1变为0);补码为反码+1 。


一、&(按位与):两个整数的补码对应的二进制位有0则为0,两个同时为1才为1,得到的数仍为补码。

举个栗子:

//&(按位与)有0为0,同为1为1
int a = 1;//    补码为:00000000000000000000000000000001
int b = 2;//    补码为:00000000000000000000000000000010
int c = a & b;//补码为:00000000000000000000000000000000
//所以c的值为0

二、|(按位或):两个整数的补码对应的二进制位有1则为1,两个同时为0才为0,得到的数仍为补码。

举个栗子:

//|(按位或)有1为1,同为0为0
int a = 1;//    补码为:00000000000000000000000000000001
int b = 2;//    补码为:00000000000000000000000000000010
int c = a | b;//补码为:00000000000000000000000000000011
//所以c的值为3

三、^(按位异或):两个整数的补码对应的二进制位相同为0,相异为1,得到的数仍为补码。

举个栗子:

//^(按位异或)相同为0,相异为1
int a = 1;//    补码为:00000000000000000000000000000001
int b = 2;//    补码为:00000000000000000000000000000010
int c = a ^ b;//补码为:00000000000000000000000000000011
//所以c的值为3

位操作符的应用:

一、&(按位与)的应用:

(1)取某个二进制数的末尾:

int a = 1;//补码:00000000000000000000000000000001
int tmp1 = a & 1;//此时tmp1的值为1
int b = 2;//补码:00000000000000000000000000000010
int tmp2 = a & 1;//此时tmp2的值为0

比如某些题目要求你按位输出某个数的二进制位,那么就可以搭配移位操作符来实现:

int main()
{
	int a = 1;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		printf("%d", a & 1);
		a >>= 1;
	}
	return 0;
}

(2)令某个二进制数最右面的1消失:

int n = 1;//n的补码:00000000000000000000000000000001
n = n & (n - 1);(n-1)的补码:00000000000000000000000000000000
//结果n的补码:00000000000000000000000000000000

二、^(按位异或)的应用:

一道面试题:不创建临时变量,交换两个数。

一般想要交换两个数是这样操作的:

tmp = num2;
num2 = num1;
num1 = tmp;

如果创建临时变量的话其实还有另一种方法:

num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;

那么如何利用^ (按位异或)来实现变量交换呢,其实^(按位异或)的运算规则满足交换律,比如:

a ^ a = 0;
a ^ 0 = a;
a ^ b ^ a = b;//先运算a ^ a = 0;在运算0 ^ b = b;
//可以理解为(a ^ a) ^ b = b;

由此我们可以知道:

a = a ^ b;
b = a ^ b;
a = a ^ b;

画一张图:

这种方法很巧妙,但是实用性并不高,它的效率甚至不如创建临时变量高,但是它可以让你更好的理解位操作符可能会实现一些零你意想不到的操作。

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

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

相关文章

Effective第三版 中英 | 第2章 创建和销毁对象 | 当面临多个参数的构造器时考虑使用构建器

文章目录 Effective第三版前言第2章 创建和销毁对象当面临多个参数的构造器时考虑使用构建器 Effective第三版 前言 大家好&#xff0c;这里是 Rocky 编程日记 &#xff0c;喜欢后端架构及中间件源码&#xff0c;目前正在阅读 effective-java 书籍。同时也把自己学习该书时的笔…

【KKT】∇f(x)+λ∇g(x)=0中λ的讨论

Karush-Kuhn-Tucker (KKT)条件 〇、问题背景 在阅读 Karush-Kuhn-Tucker (KKT)条件 时&#xff0c;不太能理解 ∇ f \nabla f ∇f 的方向&#xff0c;以及 ∇ g \nabla g ∇g 的方向&#xff1a; 为什么 ∇ f \nabla f ∇f 是指向可行域内部&#xff0c; ∇ g \nabla g ∇g…

Java多线程方面知识

目录 1.程序、进程、线程 2.进程与线程的内存解析 3.并发与并行 4.Java程序的线程 5.多线程的创建&#xff1a;方式一&#xff1a;继承于Thread类 6.start方法的作用 7.使用start()时要注意的问题 8.Thread类中的一些方法 9.线程的优先级 10.多线程的创建&#xff1a…

【JAVA】清缓存(打断点删除 / 新增表或字段无效)

一. 打断点无效 情景 新写了一个获取列表数据接口&#xff0c;前端调用的&#xff0c;获取到的数据为空数组。在数据库中查看&#xff0c;是有数据的&#xff0c;但是调用接口返回数据为空。接下来就打断点啦&#xff0c;发现无效&#xff01;表现如下 没有可执行的…

【Bio】牙的分类

文章目录 IncisorCentral IncisorLateral Incisor Canine / CuspidPremolarFirst PremolarSecond Premolar MolarFirst MolarSecond MolarThird Molar / Wisdom Tooth Ref Incisor Central Incisor Lateral Incisor Canine / Cuspid Premolar First Premolar Second Prem…

第六十二天学习记录:C语言进阶:C语言预处理2

带副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候&#xff0c;如果参数带有副作用&#xff0c;那么你在使用这个宏的时候就可能出现危险&#xff0c;导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。例如&#xff1a; x1;//不带副作用 x;//带有副作…

安全认证:

1. 认证概述 为什么要有认证&#xff1f; 防止非法路由器接入企业内网的ospf路由器&#xff0c;保护内网安全 2. 认证方式 认证方式分为接口认证和区域认证&#xff0c;接口认证和区域认证没有本质的区别&#xff0c;接口认证是当区域内链路过多的情况下&#xff0c;接口认证…

Java网络开发(Tomcat)—— Servlet学习 Web相关背景知识 JavaWeb项目初步

本文目录 引出一、软件架构BS和CS二、实现Web服务的条件和步骤三、Tomcat搭建Web项目初步1.pom.xml文件配置2.web.xml文件更新3.Tomcat运行环境配置4.项目文件层级解析 四、JavaWeb项目文件分类&#xff08;1&#xff09;静态文件—存放位置&#xff08;2&#xff09;动态文件-…

【用人话讲算法】leetcode无重复字符的最长子串

【用人话讲算法】leetcode无重复字符的最长子串 文章目录 【用人话讲算法】leetcode无重复字符的最长子串题目简单思路&#xff08;暴力&#xff09;优化思考怎么写代码&#xff1f;怎么到下一个&#xff1f;whilefor 思路总结while和for循环总结 题目 题目的意思是说&#xff…

一台电脑上安装多个版本的python,运行互不干扰,显示位置的一些命令,

首先需要知道一些命令&#xff1a; pip show 包名 可以使用pip show 包名的方式显示位置 pip list pip方式显示的是当前环境下的库 os.environ.get&#xff08;&#xff09; python中os模块获取环境变量的一个方法 Python os.environ.get&#xff08;&#xff09;的用法 …

使用Git LFS上传Unity大型资源文件

在使用Unity制作结课作业时&#xff0c;使用到git工具进行版本控制与多人协作。在提交项目至远程仓库的过程中&#xff0c;git bash提示了以下报错&#xff1a; remote: warning: File Assets/Models/Z_India_5.29.fbx is 57.31 MB; this is larger than GitHubs recommended m…

利用环回口建立IBGP邻居

利用环回口建立IBGP邻居 BGP的稳定性 IBGP : 1.一般使用环回口建立IBGP邻居 2.指定建立IBGP邻居的源地址为lookback地址 EBGP : 1.一般使用直连接口建立EBGP邻居关系 2.如果想使用环回口建立EBGP邻居&#xff0c;需要将TTL值修改为大于1&#xff0c;默认TTL1 修改命令…

在win10/11的右键菜单添加电源选项

前言&#xff1a; 今天&#xff0c;博主从网上找到了在右键菜单中添加电源选项的方法&#xff0c;觉得挺实用的所以来教大家 方法&#xff1a; 下载&#xff08;懒人专用&#xff0c;直接打开文件即可&#xff09;&#xff1a; csdn中下载&#xff08;启用和关闭文件都有&a…

基于 Docker_redis6.0.8 实现 Redis 集群扩缩容

文章目录 单机部署数据分区方案集群部署集群容错测试集群扩容测试集群缩容测试 LXL&#xff1a;这玩意太枯燥&#xff0c;看完需要耐心 ~~~ 单机部署 通过 dockerhub 查找 redis 镜像&#xff0c;选择 6.0.8 版本。创建挂载目录&#xff0c;并赋予权限。 mkdir -p /var/docker…

MicroPython应用基础-使用Thonny IDE

MicroPython应用基础-使用Thonny IDE 文章目录 MicroPython应用基础-使用Thonny IDE引言Thonny简介使用Thonny连接到MicroPython开发板使用Thonny的REPL窗口运行Python语句在Thonny中保存Python程序文件至MicroPython开发板中运行使用Thonny的注意要点 引言 在很长一段时间内&…

[论文分享]TimeMAE:解耦掩码自编码器时间序列的自监督表示

论文题目&#xff1a;TimeMAE: Self-Supervised Representations of Time Series with Decoupled Masked Autoencoders 论文地址&#xff1a;https://arxiv.org/abs/2303.00320 代码地址&#xff1a;https://github.com/Mingyue-Cheng/TimeMAE 1 摘要 利用自监督预训练增强基于…

Flume和Kafka的组合使用

一.安装Kafka 1.1下载安装包 通过百度网盘分享的文件&#xff1a;复制链接打开「百度网盘APP 即可获取」 链接&#xff1a;https://pan.baidu.com/s/1vC6Di3Pml6k1KMbnK0OE1Q?pwdhuan 提取码&#xff1a;huan 也可以访问官网&#xff0c;下载kafka2.4.0的安装文件 1.2解…

Hadoop3.1.3安装(单机、伪分布)

系列文章目录 Ubuntu常见基本问题 Hadoop3.1.3安装&#xff08;单机、伪分布&#xff09; Hadoop集群搭建 文章目录 系列文章目录一、环境1、创建hadoop用户 二、更新apt三、安装SSH、配置SSH无密码登陆四、安装Java环境五、安装 Hadoop3.1.3六、Hadoop单机配置(非分布式)七、…

chatgpt赋能python:Python为什么被吹得这么神?

Python为什么被吹得这么神&#xff1f; Python是一个开源、跨平台的高级编程语言&#xff0c;由Guido van Rossum于1989年在荷兰创造。Python在近几年因其方便易用、高效稳定和丰富的生态体系而备受欢迎。Python被广泛应用于数据科学、人工智能、机器学习、Web开发、自动化测试…

启动虚拟机并安装Linux系统

我们刚刚新建的虚拟机相当于一个裸机&#xff0c;还没有安装操作系统在里面&#xff0c;下面我们来看一下怎么进行Linux系统的安装。 在VMware Workstation工具的主界面选择虚拟机Spark01&#xff0c;单击鼠标右键在弹出的菜单中选择“设置”打开“虚拟机设置”对话框。如下图…