目录
[2.1 二进制转十进制](#2.1 二进制转十进制)
[2.2 二进制转八进制](#2.2 二进制转八进制)
[2.3 二进制转十六进制](#2.3 二进制转十六进制)
[4.1 左移操作符](#4.1 左移操作符)
[编辑 4.2 右移操作符](#编辑 4.2 右移操作符)
[7.1 优先级](#7.1 优先级)
[7.2 结合性](#7.2 结合性)
一、操作符的分类
这是操作符的种类,有很多种,今天讲的操作符中有⼀些操作符和⼆进制有关系,我们先铺垫⼀下⼆进制的和进制转换的知识。
二、二进制和进制转换
其实我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢?其实2进制、8进制、10进制、16进制是数值的不同表示形式而已。
比如数值15的各种进制的表示形式:
15的2进制:1111
15的8进制:17
15的10进制:15
15的16进制:F
我们重点介绍⼀下⼆进制: 首先我们还是得从10进制讲起:
• 10进制中满10进1
• 10进制的数字每⼀位都是0~9的数字组成
其实⼆进制也是⼀样的
• 2进制中满2进1
• 2进制的数字每⼀位都是0~1的数字组成
那么 1101 就是⼆进制的数字了。
2.1 二进制转十进制
10进制的123表示的值是一百二十三,为什么是这个值呢?其实10进制的每⼀位是权重的,10进 制的数字从右向左是个位、十位、百位....,分别每⼀位的权重是10的0次方、10的1次方......
2进制和10进制是类似的
比如二进制中的1101:
2.2 二进制转八进制
8进制的数字每⼀位是0~7的,0~7的数字,各⾃写成2进制,最多有3个2进制位就足够了,比如7的二进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算⼀ 个8进制位,剩余不够3个2进制位的直接换算。
如:2进制的01101011,换成8进制:0153,0开头的数字,会被当做8进制。
2.3 二进制转十六进制
16进制的数字每⼀位是0~9,a~f的,0~9,a~f的数字,各自写成2进制,最多有4个2进制位就足够了,比如f的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进 制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算。
如:2进制的01101011,换成16进制:0x6b,16进制表示的时候前面加0x
三、原码、反码、补码
整数的2进制表示方法有三种,即原码、反码和补码,有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号位,剩余的都是数值位,符号位都是用0表示"正",用1表示"负"。
正整数的原、反、补码都相同 , 负整数的三种表示方法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
对于整形来说:数据存放内存中其实存放的是补码:
在计算机系统中,数值⼀律用补码来表示和存储。原因在于,使用补码可以将符号位和数值域统⼀处理,同时,加法和减法也可以统⼀处理(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.算术右移:左边用原该值的符号位填充,右边丢弃
#include <stdio.h>
int main()
{
int num = 10;
int n = num>>1;
printf("n= %d\n", n);
printf("num= %d\n", num);
return 0;
}
逻辑右移
算数右移
五、位操作符
位操作符有:
& 按位与
| 按位或
^ 按位异或
~ 按位取反
按位与:&
按位与的定义是:同一二进制位上的数字都是1的话,&的结果为1,否则为0.
0 & 0 = 0;
0 & 1 = 0;
1 & 1 = 1;
不同大小的数据位操作的原则,低位对齐,高位补零。
按位或:|
定义:只要参与运算的双方其中有一个是1,结果就是1.同0才为0.
0 | 0 = 0;
0 | 1 = 1;
1 | 0 = 1;
1 | 1 = 1;
不同大小的数据位操作的原则,低位对齐,高位补零。
按位异或:^
只要参与运算的双方互异,结果就为1,否则为0.
0 ^ 1 = 1;
1 ^ 0 = 1;
1 ^ 1 = 0;
0 ^ 0 = 0;
不同大小的数据位操作的原则,低位对齐,高位补零。
按位取反:~
对一个二进制数进行取反。1变0,0变1.
唯一需要注意的一点是,~的优先级是位运算符中最高的,必须优先计算。
六、逗号表达式
逗号表达式,就是用逗号隔开的多个表达式,逗号表达式,从左向右依次执行,整个表达式的结果是最后⼀个表达式的结果。
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
上述代码中,就是从左向右依次执行,最后的结果就是c的值。
七、操作符的属性
C语⾔的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。
7.1 优先级
优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执行,各种运算符的优先级是不⼀样的。
3 + 4 * 5;
上面示例中,表达式 3 + 4 * 5 里面既有加法运算符( + ),又有乘法运算符( * )。由于乘法的优先级高于加法,所以会先计算 4 * 5 ,而不是先计算 3 + 4 。
7.2 结合性
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执行顺序。⼤部分运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符( = )。
5 * 6 / 2;
上面示例中, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执行,先计算 5 * 6 , 再计算 6 / 2 。
运算符的优先级顺序很多,下面是部分运算符的优先级顺序(按照优先级从高到低排列)
由于圆括号的优先级最高,可以使用它改变其他运算符的优先级。
本篇内容就先到这里了,操作种类繁多,我只挑了一部分写,希望对各位有帮助,如果有错误欢迎指出。