前言
扫雷的爆炸展开可能要拖一拖了
刚刚学完操作符不写个笔记记录一下实在可惜。
所以今天搞一下操作符详解的第一部分。
一、操作符分类
运算操作符
分为 加’+’ 减 ‘-’ 乘 ‘*’ 除 ‘/’ 取模 ‘%’
优先级按顺序为 乘大于除大于取模大于加大于减
(取模是得到余数例如 2%3 = 2; 5%3 = 2)
计算机储存整数原理
我们在了解移位操作符的时候必须要先了解计算机储存整数原理:
整数一般以二进制位储存到计算机中
以补码(马上就介绍)的形势存储
我们计算机将整数的二进制位分成了原码 反码 补码
原码就是整数的二进制位比如1的原码就是
00000000000000000000000000000001
整数的原码反码补码相同(都同上方原码)
负数原码例如-1为
10000000000000000000000000000001
反码为原码按位取反我们只需知道它可以将二进制的0转换为1将1转换为0
我们需要记得补码是我们操作的对象即可进行下一步的位移操作符介绍。
移位操作符
注: 操作符的对象只能是整数
分别有左移’<<'和右移 ‘>>’ 左移右移都是对补码的二进制位的位移比如 1<<5 位为32就是因为<<是对二进制位进行的操作下面我会用图片进行说明(下面先讲了左移操作符)
这个结果就是将1的二进制位整体左移了5位使1变成了32
再比如-5
我们直接将因左移而出内存的数字去除在右侧补0
右移操作符
“>>”
右移操作符又与左移操作符不同
右移操作时分为两类进行操作
逻辑右移(补上0)
算数右移(补原来的符号位)
(具体是那种右移由编译器决定,常见的编译器大多为算数右移)
先介绍逻辑右移
逻辑右移是将整体右移后在左边补上0
上图!
我们直接将出内存的二进制舍去不要在空缺的位置补上0
算数右移
同上的逻辑右移我们将出内存的不要在左边补上原来的符号位
位操作符
(只对整数操作,且他们都是对补码进行操作)
& 按位与
| 按位或
^ 按位异或
首先按位与 将两个数字的二进制位进行比较同为一则为一一个为零则为零
上图!
返回最下方的数字 及3(这里我们不禁疑惑这里的结果是原码还是补码呢?)下面我们用-1 和-3来解答
上图!
结果看出是补码打印时依旧要进行转换得到原码。
按位或:(只要有1就为1)
不bb
上图!
类比按位与得到的结果依旧为补码使用时要记得变成原码。
按位异或 ‘^’
相同为0 相异为1
上图!!!!!
注意得到的依旧为补码要使用时一定要将它恢复成原码
要注意’^'按位异或有一个特性 如"a ‘^’ b^b" = a;
我们通过图片来解释这个特性
上图!
我们可以使用这个特性实现不使用临时变量来交换变量的目的
先来看看我们的代码:
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.我们计算机都是对补码进行运算如果运算出负数记得将它恢复成原码。