操作符详解(一)(跑路笔记)

简介: 操作符详解(一)(跑路笔记)

前言

扫雷的爆炸展开可能要拖一拖了


刚刚学完操作符不写个笔记记录一下实在可惜。

所以今天搞一下操作符详解的第一部分。


一、操作符分类

运算操作符

分为 加’+’ 减 ‘-’ 乘 ‘*’ 除 ‘/’ 取模 ‘%’

优先级按顺序为 乘大于除大于取模大于加大于减

(取模是得到余数例如 2%3 = 2; 5%3 = 2)


计算机储存整数原理

我们在了解移位操作符的时候必须要先了解计算机储存整数原理:

整数一般以二进制位储存到计算机中

以补码(马上就介绍)的形势存储

我们计算机将整数的二进制位分成了原码 反码 补码

原码就是整数的二进制位比如1的原码就是

00000000000000000000000000000001

整数的原码反码补码相同(都同上方原码)


负数原码例如-1为

10000000000000000000000000000001

image.png

反码为原码按位取反我们只需知道它可以将二进制的0转换为1将1转换为0

image.png

我们需要记得补码是我们操作的对象即可进行下一步的位移操作符介绍。


移位操作符

注: 操作符的对象只能是整数

分别有左移’<<'和右移 ‘>>’ 左移右移都是对补码的二进制位的位移比如 1<<5 位为32就是因为<<是对二进制位进行的操作下面我会用图片进行说明(下面先讲了左移操作符)

image.png

image.png


这个结果就是将1的二进制位整体左移了5位使1变成了32

再比如-5


image.png

我们直接将因左移而出内存的数字去除在右侧补0

右移操作符

“>>”

右移操作符又与左移操作符不同

右移操作时分为两类进行操作


逻辑右移(补上0)

算数右移(补原来的符号位)

(具体是那种右移由编译器决定,常见的编译器大多为算数右移)

先介绍逻辑右移

逻辑右移是将整体右移后在左边补上0

上图!

image.png

我们直接将出内存的二进制舍去不要在空缺的位置补上0

算数右移

同上的逻辑右移我们将出内存的不要在左边补上原来的符号位

位操作符

(只对整数操作,且他们都是对补码进行操作)

& 按位与

| 按位或

^ 按位异或


首先按位与 将两个数字的二进制位进行比较同为一则为一一个为零则为零

上图!

image.png

返回最下方的数字 及3(这里我们不禁疑惑这里的结果是原码还是补码呢?)下面我们用-1 和-3来解答

上图!


image.png

image.png

结果看出是补码打印时依旧要进行转换得到原码。

按位或:(只要有1就为1)

不bb

上图!

image.png

类比按位与得到的结果依旧为补码使用时要记得变成原码。

按位异或 ‘^’

相同为0 相异为1

上图!!!!!

image.png

注意得到的依旧为补码要使用时一定要将它恢复成原码


要注意’^'按位异或有一个特性 如"a ‘^’ b^b" = a;

我们通过图片来解释这个特性

上图!


image.png

我们可以使用这个特性实现不使用临时变量来交换变量的目的

先来看看我们的代码:


int main(void)
{
  int a = 3;
  int b = 5;
  printf("交换前 %d %d\n", a, b);
  a = a ^ b;
  b = a ^ b;
  a = a ^ b;
  printf("交换后 %d %d", a, b);
  return 0;
}



我们利用上面的特性先使 a =a ^ b; 再使 b = a ^ b 此时的a已经为a ^ b 所以实际上 b = a ^ b ^ b 因为特性所以 此时b = a然后我们使 a = a ^ b 就将原本为a ^ b 的a =a ^ b^ a 就成功了交换了这两个的数值


‘~’ 操作符

对一个数的补码进行按位取反(包括符号位)

上图!



本为0的a经过~就变成了-1.


总结

今天的操作符就到这里吧:

下面进行小结

今天主要讲解了位操作符和移位操作符都是对计算机储存的二进制位进行的操作我们主要要记得

1.正数二进制中原、反、补码相同负数要进行运算

2.我们计算机都是对补码进行运算如果运算出负数记得将它恢复成原码。


相关文章
|
Go
第77/90步《番外篇》第4章 Go语言三:复合数据类型 第32课
今天学习《番外篇》第4章 Go语言三:复合数据类型 第32课 字典
64 0
|
Go
第78/90步《番外篇》第4章 Go语言三:复合数据类型 第33课
今天学习《番外篇》第4章 Go语言三:复合数据类型 第33课 结构体与接口
87 0
|
Go
第76/90步《番外篇》第4章 Go语言三:复合数据类型 第31课
今天学习《番外篇》第4章 Go语言三:复合数据类型 第31课 切片
76 0
|
安全 Go
第79/90步《番外篇》第4章 Go语言三:复合数据类型 第34课
今天学习《番外篇》第4章 Go语言三:复合数据类型 第34课 指针与错误
66 0
|
Go
第75/90步《番外篇》第4章 Go语言三:复合数据类型 第30课
今天学习《番外篇》第4章 Go语言三:复合数据类型 第30课 数组
54 0
|
Java 开发者
闯祸了,我用了一个‘<>’操作符引发的线上Bug
闯祸了,我用了一个‘<>’操作符引发的线上Bug
209 0
闯祸了,我用了一个‘<>’操作符引发的线上Bug
|
存储 编译器 Linux
0基础C语言保姆教程——第六节 操作符、表达式和语句
加法或者减法都是双目操作符,就是必须要求有两个操作对象才能够用它,这也很好理解,加法、减法要两个数才能加减对吧。
141 0
0基础C语言保姆教程——第六节 操作符、表达式和语句
【C#】【平时作业】习题-3-数组
【C#】【平时作业】习题-3-数组
81 0
【C#】【平时作业】习题-3-数组
|
Shell
Ansible概述和模块解释(你刚走过了今天,而扑面而来的却是昨天)(二)
Ansible概述和模块解释(你刚走过了今天,而扑面而来的却是昨天)(二)
232 0
Ansible概述和模块解释(你刚走过了今天,而扑面而来的却是昨天)(二)
|
运维 Devops Linux
Ansible概述和模块解释(你刚走过了今天,而扑面而来的却是昨天)(一)
Ansible概述和模块解释(你刚走过了今天,而扑面而来的却是昨天)(一)
214 0
Ansible概述和模块解释(你刚走过了今天,而扑面而来的却是昨天)(一)