武器大师——操作符详解(上)

news2024/11/19 3:16:52

目录

一、操作符的分类

二、二进制和进制转换

2.1.二进制与十进制的互相转化

2.1.1  二进制转十进制

2.1.2  十进制转二进制

 ​编辑

 2.2.二进制转8进制和16进制

2.2.1  转8进制

2.2.2  转16进制

三、原码、反码、补码

四、移位操作符

4.1.左移操作符(<<)

4.2.右移操作符(>>)

五、位操作符

5.1.按位与(&)

5.2.按位或(|)

5.3.按位异或(^)

5.4.按位取反(~)


一、操作符的分类

算术操作符: + - * / %
移位操作符: << >>
位操作符: & | ^ ~
赋值操作符: = += -= *= /= %= <<= >>= &= |= ^=
单⽬操作符: !、 ++ -- & * + - ~ sizeof ( 类型 )
关系操作符: > >= < <= == !=
逻辑操作符: && ||
条件操作符: ? :
逗号表达式: ,
下标引⽤: [ ]
函数调⽤: ()

上述操作符,我们在之前的学习中,已经了解了许多,比如说算数操作符、赋值操作符、逻辑操作符、条件操作符(三目)以及部分的单目操作符。这篇文章,白刘将带领大家继续学习一部分。由于本篇文章要介绍的操作符跟二进制有关系,所以我们先来简单介绍一下二进制以及进制转换。

二、二进制和进制转换

我们经常能听到各种进制,像我们数学中十进制,时间的60进制,内存的1024进制......不管是什么进制,他们其实只是数值的表达方式不同而已。

在这里我们着重介绍二进制:

首先我们在生活中最最熟知的是十进制,所以我们从十进制入手。

我们可以观察到,十进制是逢十进一,那可以推断,二进制就是逢二进一。十进制中存在0~9十个数字,那二进制同样也存在0~1共两个数字。

2.1.二进制与十进制的互相转化

2.1.1  二进制转十进制

首先我们还是观察十进制,随机举个例子,123,为什么叫一百二十三呢?这是因为每一位是有权重的,我们位是从右向左依次升高的:个位、十位、百位......,每一位分别代表的权重是10º , 10¹ , 10² ......

如图所示:

而我们说二进制和十进制类似,只不过权重不同,二进制从右到左依次是:2º、2¹、2²...

那我们来试一试,二进制中1101怎么理解呢?

如图:

在二进制转十进制时,我们往往要记忆一些2的次方数,如8,16,32,64,128...,这些数字方便我们转换。我们可以通过看是第几位,然后换成次方数,再求和,熟练掌握,我们就能很快地换算。

2.1.2  十进制转二进制
 

我们可以将一个十进制数一直除二,看它的余数。

 2.2.二进制转8进制和16进制

2.2.1  转8进制

首先介绍一下八进制,顾名思义,逢八进一,和十进制不同,八进制有个特点,由于8是2的三次方,所以这里提供一种特别的方式来进行转换:

我们将二进制数每三位分成一位,然后将每一位换算成0~7的数字,如上图,011就换成了3,101换成了5,前面不够三位,也是直接换,01换成1。所以二进制数01101011,换成八进制就是0153。

注意,八进制数前面要加上0,代表其为八进制数。

2.2.2  转16进制

16为2的4次方,依据刚刚八进制的转换,相信大家能猜到16进制怎么换了——分四位。

而有人问了,我认识的数字最多就0~9,剩下的不够怎么办。

我们在十六进制中,用a表示10,b表示11...,一直到f表示15。

注意,十六进制数前面要加上0x。所以上述二进制数01101011,换成十六进制就是0x6b。 

三、原码、反码、补码

整数的二进制表示方法一共有三种:原码、反码、补码。

有符号整形的三种表示方法都分为两个部分:符号位和数值位。其中符号位为最高的一位,它以1表示负,0表示正。

正整数的原反补都相同。

而负整数则需要计算。

原码:直接将数值按照正负数的形式转换为二进制得到的就是原码。

反码:原码的符号位不变,其它位均取反即可得到反码。(取反就是0变成1,1变成0)。

补码:反码+1就是补码。

补码变到原码有两种方式:

1.先减一再取反     2.先取反再加一

对于整形来说,数据存放内存中的其实是补码。

 

这是因为,在计算机系统中,数值⼀律⽤补码来表示和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

前面铺垫了这么多,接下来终于可以开始正题了,我们开始介绍操作符。

四、移位操作符

 移位操作符分为左移操作符(<<)右移操作符(>>)。这里要注意的是,我们使用移位操作符只能操作整数。

4.1.左移操作符(<<)

操作规则:左边抛弃,右边补0

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

运行结果:

4.2.右移操作符(>>)

操作规则:右移运算分两种,逻辑右移和算数右移,这个是根据编译器来决定的,大部分通常是算数右移

1.逻辑右移,左边填0,右边丢弃

2.算数右移,左边用原符号位填充,右边丢弃

 对于移位操作符,不要移动负数位,因为这个属于标准未定义。

int num = 10;
num>>-1;//error

五、位操作符

位操作符一共有四个:

1. &   // 按位与

2. |    // 按位或

3. ^   // 按位异或

4. ~   // 按位取反

所有位操作符所操作的都是补码 

5.1.按位与(&)

口诀: 见0为0,同1为1

00000000000000000000000000000011 3的补码

10000000000000000000000000000101 -5的原码
11111111111111111111111111111010 -5的反码
11111111111111111111111111111011 -5的补码

00000000000000000000000000000011
11111111111111111111111111111011  见0为0,同1为1
00000000000000000000000000000011 补码

所以3 & -5的结果为3
  

5.2.按位或(|)

口诀: 同0为0,见1为1

00000000000000000000000000000011 3的补码

10000000000000000000000000000101 -5的原码
11111111111111111111111111111010 -5的反码
11111111111111111111111111111011 -5的补码

00000000000000000000000000000011
11111111111111111111111111111011  同0为0,见1为1
11111111111111111111111111111011 补码
10000000000000000000000000000100 取反
10000000000000000000000000000101 加一

所以3 | -5的结果为-5

5.3.按位异或(^)

口诀:相同为0,不同为1

00000000000000000000000000000011 3的补码

10000000000000000000000000000101 -5的原码
11111111111111111111111111111010 -5的反码
11111111111111111111111111111011 -5的补码

00000000000000000000000000000011
11111111111111111111111111111011  相同为0,不同为1
11111111111111111111111111111000  补码
10000000000000000000000000000111  取反
10000000000000000000000000001000  加一

所以3 ^ -5的结果为-8

5.4.按位取反(~)

没啥口诀,顾名思义即可。

int a = 0;
int b = ~a;

00000000000000000000000000000000  a的补码
11111111111111111111111111111111  按位取反,得到补码
10000000000000000000000000000000  取反
10000000000000000000000000000001  加一

故b的值为-1

未完待续...

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

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

相关文章

【web APIs】3、(学习笔记)有案例!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、概念其他事件页面加载事件元素滚动事件页面尺寸事件 元素尺寸与位置 二、案例举例电梯导航 前言 掌握阻止事件冒泡的方法理解事件委托的实现原理 一、概念…

省市区街道/乡镇四级联动vue3

最近优化了一个省.市.区/县、乡镇/街道的四级联动组件&#xff0c;技术栈是element vue3记录一下。 本来是这样的三级联动&#xff1a; 这个三级联动很简单&#xff0c;直接利用el-select组件把地区值带进去就行了&#xff0c;现在要优化成省.市.区/县、乡镇/街道的四级联动&…

若依前后端分离版开源项目学习

前言&#xff1a;vscode中vue代码没有高亮显示&#xff0c;可以下载vetur插件解决&#xff0c;ctrl点击无法跳转函数定义问题&#xff0c;可以下载vue-helper插件解决&#xff1b;idea中ctrl点击函数即可跳转函数定义。 一、登录 1.生成验证码 基本思路&#xff1a; 后端生…

算法沉淀——动态规划之子序列问题(下)(leetcode真题剖析)

算法沉淀——动态规划之子序列问题 01.最长定差子序列02.最长的斐波那契子序列的长度03.最长等差数列04.等差数列划分 II - 子序列 01.最长定差子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-arithmetic-subsequence-of-given-difference/ 给你一个整数数…

高级语言期末2011级A卷(软件学院)

1.编写函数&#xff0c;判定正整数m和n&#xff08;均至少为2&#xff09;是否满足&#xff1a;数m为数n可分解的最小质因数&#xff08;数n可分解的最小质因数为整除n的最小质数&#xff09; 提示&#xff1a;判定m为质数且m是n的最小因数 #include <stdio.h> #include…

【kubernetes】关于k8s集群的资源发布方式(灰度/滚动发布)

目录 一、常见的发布方式 二、详解kubectl陈述式方式做灰度发布&#xff08;金丝雀发布&#xff09; 步骤一&#xff1a;先基于deployment控制器创建pod&#xff0c;然后发布 步骤二&#xff1a;基于命令行灰度发布 步骤三&#xff1a;测试等到版本稳定以后&#xff0c;再完…

Java项目开发如何设计整体架构,字节跳动服务端研发面试

并发编程共享模型篇 并发编程概览进程与线程Java线程共享模型之管程共享模型之内存共享模型之无锁共享模型之不可变共享模型之工具 共享模型之管程 原理之 Monitor(锁) 原理之伪共享 模式篇—正确姿势 同步模式之保护性智停同步模式之Blking同步模式之顺序控制异步模式之生产…

【数据结构(C语言)】排序详解

目录 文章目录 前言 一、排序的概念 1.1 排序的概念 1.2 常见的排序算法 二、插入排序 2.1 直接插入排序 2.1.1 基本思想 2.1.2 特性总结 2.1.3 代码实现 2.2 希尔排序 2.2.1 基本思想 2.2.2 特性总结 2.2.3 代码实现 三、选择排序 3.1 直接选择排序 3.1.1…

要在Javascript中实现表格新增行功能,且添加元素,增删操作

起始表格元素&#xff1a; <!-- table>(thead>tr>th*6)(tbody>tr>td*6) --><div class"container"><table id"myTable"><caption><h3>员工信息管理系统</h3></caption><thead><tr>&…

初识Lombok

前言 最近读一些公司的业务代码&#xff0c;发现近几年的java项目工程中都使用了lombok&#xff0c;lombok是一个可以自动生成get,set、toString等模板类方法的工具框架&#xff0c;程序再引入lombok后&#xff0c;添加一个注解便可以不写get\set\toString等方法。 Lombok示例…

人工智能_CPU微调ChatGLM大模型_使用P-Tuning v2进行大模型微调_007_微调_002---人工智能工作笔记0102

这里我们先试着训练一下,我们用官方提供的训练数据进行训练. 也没有说使用CPU可以进行微调,但是我们先执行一下试试: https://www.heywhale.com/mw/project/6436d82948f7da1fee2be59e 可以看到说INT4量化级别最低需要7GB显存可以启动微调,但是 并没有说CPU可以进行微调.我们…

C语言中如何进行内存管理

主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《C语言》 C语言是一种强大而灵活的编程语言&#xff0c;但与其他高级语言不同&#xff0c;它要求程序员自己负责内存的管理。正确的内存管理对于程序的性能和稳定性至关重要。 一、引言 C 语言是一门广泛使用的编程语…

【算法历练】动态规划副本—路径问题

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;宙でおやすみ 1:02━━━━━━️&#x1f49f;──────── 2:45 &#x1f504; ◀️ ⏸ ▶️ ☰ &#…

现在在市场上云主机一般多少钱?影响其价格的因素有哪些

现在很多人都会购买云主机来帮助自己存储一些数据&#xff0c;但是很多人在购买云主机的时候最担心的就是云主机的价格。 由于很多人担心云服务器的价格会很高&#xff0c;因此一直在密切关注目前市场上各品牌云主机的相关价格。 下面就给大家详细介绍一下现在市场上一台云主机…

【DDD】学习笔记-领域驱动设计对持久化的影响

资源库的实现 如何重用资源库的实现&#xff0c;以及如何隔离领域层与基础设施层的持久化实现机制&#xff0c;具体的实现还要取决于开发者对 ORM 框架的选择。Hibernate、MyBatis、jOOQ 或者 Spring Data JPA&#xff08;当然也包括基于 .NET 的 Entity Framework、NHibernat…

若依Vue3:新一代前后端分离权限管理系统

若依Vue3&#xff1a;新一代前后端分离权限管理系统 随着技术的不断进步&#xff0c;前后端分离的开发模式逐渐成为主流&#xff0c;特别是在构建权限管理系统时。在这样的背景下&#xff0c;若依Vue3应运而生&#xff0c;作为基于Spring Boot、Spring Security、JWT、Vue3、V…

【C++】树形关联式容器set、multiset、map和multimap的介绍与使用

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.关联式容器 2.键…

二叉搜索树在线OJ题讲解

二叉树创建字符串 我们首先进行题目的解读&#xff1a; 大概意思就是用&#xff08;&#xff09;把每个节点的值给括起来&#xff0c;然后再经过一系列的省略的来得到最后的结果 大家仔细观察题目给出的列子就可以发现&#xff0c;其实这个题目可以大致分为三种情况&#xff1…

基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面

目录 简介注册与软件获取工程配置设计 UI导出源码板级验证更多内容 简介 SquareLine Studio 是一款专业的 UI 设计软件&#xff0c;它与 LVGL&#xff08;Light and Versatile Graphics Library&#xff0c;轻量级通用图形库&#xff09;紧密集成。LVGL 是一个轻量化的、开源的…

[linux][xdp] xdp 入门

xdp 全称 eXpress Data Path&#xff0c;是 linux ebpf 中的一个功能。ebpf 在内核中预留了一些插入点&#xff0c;用户可以在这些插入点插入自己的处理逻辑&#xff0c;当数据路过插入点时可以做一些预期的处理&#xff0c;具体实现方式如下&#xff1a; ① 用户编写数据处理…