那些也许你不知道的操作符!

前言

操作符有很多种,目前我们已经了解了一部分

例如最简单的+、-、*、/、=,还有我们学到的&&,||,!等,但是操作符可不是就只有这么些的,让我们一起来看看吧

目录

1. 移位操作符

原码、反码、补码

1.1 <<左移操作符

1.2 >>右移操作符

2. 位操作符

&按位与

|按位或

^按位异或

~按位取反

3.整型提升


1. 移位操作符

在学习移位操作符前要对二进制有一定的了解

原码、反码、补码

整数的二进制表示方法有三种,分别是原码、反码、补码

原码:直接将正负数按照二进制的形式翻译得到的就是原码

反码:符号位不变,其他位依次按位取反即可(0变1,1变0)

补码:反码 + 1 得到补码

整型int占4个字节,所以一共有32个bit位,可以存放32个0或1

第一个bit位是符号位,如果整数为正,符号位是0,整数为负,符号位是1,剩下的31个bit位正常存放

正整数的原码、反码、补码都是相同的,为原码

例如:整数-5

5转换为二进制为:101,那么它的原码就是:10000000 00000000 00000000 00000101
反码符号位不变,其他按位取反:11111111 11111111 11111111 11111010
补码为反码 + 1 ,11111111 11111111 11111111 11111011

原码取反加1能得到补码,补码也能取反加1得到原码哦

小知识:计算机在内存中对于数据的存储其实存放的都是补码

1.1 <<左移操作符

移位规则:左边抛弃,右边补0

#include <stdio.h>int main()
{int num = 5; //00000000 00000000 00000000 00000101int n = num << 1; //00000000 00000000 00000000 00001010printf("%d", n);return 0;
}
输出结果:10

 这里面其实有个规律,如果我们再次使用左移操作符,得到的为20,再一次得到的是40

#include <stdio.h>int main()
{int num = 5; //00000000 00000000 00000000 00000101int t = 3;while (t--) //t为循环次数{num = num << 1;printf("%d ", num);}return 0;
}

 

从5到10到20到40,我们可以发现它是以2倍的形式增加的

1.2 >>右移操作符

移位规则:左边补符号位,右边抛弃

#include <stdio.h>int main()
{int num = 10; //00000000 00000000 00000000 00001010int n = num >> 1; //00000000 00000000 00000000 00000101printf("%d", n);return 0;
}

这里的规律也是类似

#include <stdio.h>int main()
{int num = 10; //00000000 00000000 00000000 00001010int t = 3;while (t--) //t为循环次数{num = num >> 1;printf("%d ", num);}return 0;
}

 

它是以2为倍数减少的

2. 位操作符

&按位与

规则:将两数补码相比较,有0则0,两者为1才为1,看代码

#include <stdio.h>int main()
{int num1 = 5;   // 5补码:00000000 00000000 00000000 00000101int num2 = -4;	//-4原码:10000000 00000000 00000000 00000100//-4反码:11111111 11111111 11111111 11111011//-4补码:11111111 11111111 11111111 11111100 两者补码按位与// 5补码:00000000 00000000 00000000 00000101//&有0则0:00000000 00000000 00000000 00000100printf("%d\n", num1 & num2); return 0;
}
输出结果:4

最后&出来的结果为补码,原码、反码、补码相同,所以原码结果为4 

|按位或

规则:将两数补码相比较,有1则1,两者为0才为0

#include <stdio.h>int main()
{int num1 = 5;   // 5补码:00000000 00000000 00000000 00000101int num2 = -4;	//-4原码:10000000 00000000 00000000 00000100//-4反码:11111111 11111111 11111111 11111011//-4补码:11111111 11111111 11111111 11111100 两者补码按位与// 5补码:00000000 00000000 00000000 00000101//补码结果:11111111 11111111 11111111 11111101//原码结果:10000000 00000000 00000000 00000011printf("%d\n", num1 | num2); return 0;
}
输出结果:-3

^按位异或

规则:将两数补码相比较,相同为0,相异为1

#include <stdio.h>int main()
{int num1 = 5;   // 5补码:00000000 00000000 00000000 00000101int num2 = -4;	//-4原码:10000000 00000000 00000000 00000100//-4反码:11111111 11111111 11111111 11111011//-4补码:11111111 11111111 11111111 11111100 两者补码按位与// 5补码:00000000 00000000 00000000 00000101//补码结果:11111111 11111111 11111111 11111001//原码结果:10000000 00000000 00000000 00000111printf("%d\n", num1 ^ num2); return 0;
}
输出结果:-7

~按位取反

规则:0变1,1变0

#include <stdio.h>int main()
{printf("%d\n",~1); //1的原码00000000 00000000 00000000 00000001//取反结果11111111 11111111 11111111 11111110//结果原码10000000 00000000 00000000 00000010return 0;
}
输出结果:-2

操作符实践

面试题:不使用第三个变量,实现两数交换

#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;
}

 

这里异或我们需要知道,n ^ n = 0 , n ^ 0 = n,上题正是利用了第一个特性

所以我们一个个代入之后就能理解了

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

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

相关文章

Stream Query Denoising for Vectorized HD Map Construction

参考代码&#xff1a;截止2024.02未开源 动机与出发点 这篇文章是在StreamMapNet的基础上做的&#xff0c;为了在局部地图感知任务上提升时序上的感知稳定性&#xff0c;参考DN-DETR中的去噪方案&#xff0c;为局部地图感知提出一种针对局部地图元素的加噪声方案以及去噪逻辑。…

【开源】JAVA+Vue.js实现海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

蓝牙BLE学习-安全

1.基本概念 蓝牙标准规定了5种基本的安全服务 身份验证:根据通信设备的蓝牙地址验证其身份。蓝牙不提供本地用户身份验证。保密性:确保只有授权的设备才能访问和查看传输的数据&#xff0c;防止窃听造成的信息泄露。授权(Authorization):在允许设备使用某项服务之前&#xff…

Verilog刷题笔记29

题目&#xff1a; Create a 100-bit binary ripple-carry adder by instantiating 100 full adders. The adder adds two 100-bit numbers and a carry-in to produce a 100-bit sum and carry out. To encourage you to actually instantiate full adders, also output the ca…

C++异常特性以及使用

异常 1.C传统的处理错误方式2.异常概念3.异常使用规则抛出和匹配规则 4.异常的重新抛出4.异常安全5.异常规范6.使用自定义的异常7.C标准异常体系7.异常优缺点 1.C传统的处理错误方式 终止程序&#xff1a;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&a…

[CUDA 学习笔记] Reduce 算子优化

Reduce 算子优化 注: 本文主要是对文章 【BBuf的CUDA笔记】三&#xff0c;reduce优化入门学习笔记 - 知乎 的学习整理 Reduce 又称之为归约, 即根据数组中的每个元素得到一个输出值, 常见的包括求和(sum)、取最大值(max)、取最小值(min)等. 前言 本文同样按照英伟达官方 PP…

C++ //练习 5.6 改写上一题的程序,使用条件运算符(参见4.7节,第134页)代替if else语句。

C Primer&#xff08;第5版&#xff09; 练习 5.6 练习 5.6 改写上一题的程序&#xff0c;使用条件运算符&#xff08;参见4.7节&#xff0c;第134页&#xff09;代替if else语句。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码…

EasyRecovery软件2024永久绿色免费版下载

EasyRecovery软件在数据恢复领域享有良好的声誉&#xff0c;并且被许多用户认为是一款好用且功能强大的软件。以下是对其功能和用户评价的简要概述&#xff1a; 恢复功能&#xff1a; EasyRecovery提供全面的数据恢复功能&#xff0c;可以恢复因删除、格式化、分区丢失、硬盘故…

Ubuntu20.04更新Cmake版本详解

最近在跑一个融合惯导定位的slam框架ins_eskf_kitti&#xff0c;在框架的安装过程中&#xff0c;需要对从GitHub上克隆下来的glog进行编译。其命令如下&#xff1a; glog&#xff1a; git clone https://github.com/google/glog.git cd glog mkdir build cd build cmake .. m…

3月第一批次❗教资认定流程简易版来啦

&#x1f4dd;材料准备 1、身份证 2、户口本/学生证/居住证/毕业证 3、考试合格证明(免试人员需要师范生职业能力证书) 4、普通话证书 5、学历证书或认证报告 6、近期一寸白底证件照 7、有效期内体检报告 8、个人承诺书(网上签署) 网上申报 1、上传个人承诺书 2、校验普通话证书…

java中事务的使用

文章目录 前言一、同一张表1.业务代码2.测试代码3.测试结果 二、不同表1.业务代码2.测试代码3.测试结果 总结 前言 本文将介绍在springboot中使用Transactional注解来完成对数据库事务的操作&#xff0c;保证数据一致性。 一、同一张表 1.业务代码 Controller Controller p…

【Web】CVE-2021-31805 s2-062漏洞复现学习

目录 Struts2介绍 漏洞概况 OGNL与Struts2 简单原理 漏洞复现 正向rce 反弹shell payload分析 Struts2介绍 Struts 2 是一个流行的用于构建 Java Web 应用程序的开源 Web 应用程序框架。它是 Apache 软件基金会下的一个顶级项目&#xff0c;是 Struts 框架的升级版本。…

使用 devc++ 开发 easyx 实现 Direct2D 交互

代码为 codebus 另一先生的 文案 EasyX 的三种绘图抗锯齿方法 - CodeBus 这里移植到 devc 移植操作如下&#xff1a; 调用dev 的链接库方式&#xff1a; project -> project option -> 如图所示 稍作修改的代码。 #include <graphics.h> #include <d2d1.…

BUUCTF-Real-[Jupyter]notebook-rce

1、简介 Jupyter Notebook&#xff08;此前被称为 IPython notebook&#xff09;是一个交互式笔记本&#xff0c;支持运行 40 多种编程语言。 如果管理员未为Jupyter Notebook配置密码&#xff0c;将导致未授权访问漏洞&#xff0c;游客可在其中创建一个console并执行任意Pytho…

Android 10.0 锁屏壁纸 LockscreenWallpaper

前言 一、设置壁纸 通过系统设置进行锁屏壁纸和桌面壁纸的设置。 Setting 部分的代码&#xff1a; packages/apps/WallpaperPicker2/src/com/android/wallpaper/module/DefaultWallpaperPersister.java private int setStreamToWallpaperManagerCompat(InputStream inputStre…

第6个-滚动动画

Day 6 - Scroll Animation 1. 演示效果 2. 分析思路 布局 所有的内容进行水平垂直居中&#xff0c;可以使用**margin:0 auto;&#xff0c;也可以使用flex**布局&#xff1a; body {background-color: #efedd6;display: flex;flex-direction: column;justify-content: center…

【C语言】实现栈

目录 &#xff08;一&#xff09;栈 &#xff08;二&#xff09;头文件 &#xff08;三&#xff09;功能实现 &#xff08;1&#xff09;初始化栈 &#xff08;2&#xff09; 栈的销毁 &#xff08;3&#xff09;压栈 &#xff08;4&#xff09; 出栈 &#xff08;5&a…

【html学习笔记】1.概念

1.概念 1.1 HTML标准格式 <html><body><p>Hello World</p></body> </html>1.2 编辑方式 新建一个笔记本文件&#xff0c;将html语法格式的内容写入。保存后将记事本的.txt后缀换成.html,就可以在浏览器里运行了 1.3 中文问题 为了避…

前端架构: 从vue-cli探究脚手架原理

从使用角度理解什么是脚手架 脚手架本质是一个操作系统的客户端 在终端中去执行一个命令&#xff0c;这个命令本身它就是一个客户端我们其实可以把脚手架理解为操作系统的一个客户端通过命令去执行它的时候&#xff0c;这个命令往往是这样的一个构造&#xff0c;如下 比如&…

【好玩AI】【Prompt】情人节了,用GPT写个【骂醒恋爱脑】的机器人跟自己对话吧

情人节了&#xff0c;让我们用GPT写个【骂醒恋爱脑】的机器人跟自己对话吧。 通过本文&#xff0c;你能学到&#xff1a; 1. 如何零代码搭建一个自己的机器人Bot 2. 骂醒恋爱脑的高级Prompt 通过本文&#xff0c;你还能得到&#xff1a; 恋爱脑可能被骂醒 为了白嫖&#xff0c;…