操作符详解

本文讲解了部分不常见的操作符,常见操作符可以查看以往的文章。

一、进制转换

  • 在计算机常见计算形式中,我们经常见到的二进制、八进制、十进制和十六进制都是数值的常见的表现形式。

1.1 二进制

1.1.1 二进制详解

  • 二进制和十进制一样,都是数值的表现形式,在理解二进制时可以借鉴一下十进制。

在十进制中:
十进制中每一位都是由0-9组成。
十进制的每一位满10进1。

则在二进制中:
十进制中每一位都是由0-1组成。
十进制的每一位满2进1。

1.1.2 十进制转换二进制

  • 这样我们就可以清楚的知道简单的数字的二进制表现形式。

十进制:10
二进制:1010

  • 如果遇到复杂的十进制转换二进制,我们可以采用除2求余的方法。

十进制:1234
二进制:10011010010
1234除以2等于617余0
617除以2等于308余1
308除以2等于154余0
154除以2等于77余0
77除以2等于38余1
38除以2等于19余0
19除以2等于9余1
9除以2等于4余1
4除以2等于2余0
2除以2等于1余0
1除以2等于0余1
由下往上所得余数为二进制

1.1.3 二进制转换十进制

  • 可以利用上面的例子,可以采用从最右面乘以2的0次方向左加一个次方的方法,将二进制准换为十进制。

二进制:10011010010
十进制:1234
0乘以2的0次方+(0)
1乘以2的1次方+(2)
0乘以2的2次方+(0)
0乘以2的3次方+(0)
1乘以2的4次方+(16)
0乘以2的5次方+(0)
1乘以2的6次方+(64)
1乘以2的7次方+(128)
0乘以2的8次方+(0)
0乘以2的9次方+(0)
1乘以2的10次方+(1024)
结果为:1024+128+64+16+2=1234

1.2 八进制

1.2.1 八进制详解

  • 八进制和二进制的转化十进制的方式相同,都是数值的表现形式,在理解八进制时可以借鉴一下二进制转换十进制。

在十进制中:
十进制中每一位都是由0-9组成。
十进制的每一位满10进1。

则在二进制中:
十进制中每一位都是由0-2组成。
十进制的每一位满2进1。

则在八进制中:
十进制中每一位都是由0-7组成。
十进制的每一位满8进1。

1.2.2 十进制转换八进制

  • 这样我们就可以清楚的知道简单的数字的八进制表现形式。

十进制:10
二进制:1010
八进制:12

  • 如果遇到复杂的十进制转换八进制,我们可以采用除8求余的方法。

十进制:1234
二进制:10011010010
八进制:2322
1234除以8等于154余2
154除以8等于19余2
19除以8等于2余3
2除以8等于0余2
十进制转八进制:由下往上所得余数为八进制

1.2.3 八进制转换十进制

  • 可以利用上面的例子,可以采用从最右面乘以8的0次方向左加一个次方的方法,将八进制准换为十进制。

八进制:2322
十进制:1234
2乘以8的0次方+(2)
2乘以8的1次方+(16)
3乘以8的2次方+(192)
2乘以8的3次方+(1024)
结果为:1024+192+16+2=1234

1.2.4 八进制转换二进制

  • 由于八进制的每一位是由0-7组成,而二进制的每三位的和也是八进制,那么2进制和八进制之间也是可以很好的准换的。

二进制:10 011 010 010
八进制:2 3 2 2
计算方法:同求十进制一样,由于每三位二进制的数和为7,所以不用担心溢出。

1.3 十六进制

1.3.1 十六进制详解

  • 十六i进制、八进制和二进制的转化十进制的方式相同,都是数值的表现形式,在理解八进制时可以借鉴一下二进制转换十进制。

在十进制中:
十进制中每一位都是由0-9组成。
十进制的每一位满10进1。

则在十六进制中:
十进制中每一位都是由0-F组成。
这里ABCDEF分别表示10、11、12、13、14、15
十进制的每一位满16进1。

1.3.2 十进制转换十六进制

  • 这样我们就可以清楚的知道简单的数字的十六进制表现形式。

十进制:30
十六进制:1E

  • 如果遇到复杂的十进制转换十六进制,我们可以采用除16求余的方法。

十进制:1234
二进制:10011010010
八进制:2322
十六进制:4D2
1234除以16等于77余2
77除以16等于4余D
4除以16等于0余4
十进制转十六进制:由下往上所得余数为十六进制

1.3.3 十六进制转换十进制

  • 可以利用上面的例子,可以采用从最右面乘以16的0次方向左加一个次方的方法,将十六进制准换为十进制。

十六进制:4D2
八进制:2322
二进制:10011010010
十进制:1234
2乘以16的0次方+(2)
13乘以16的1次方+(208)
4乘以16的2次方+(1024)
结果为:1024+207+2=1234

1.3.4 十六进制转换二进制

  • 由于十六进制的每一位是由0-F组成,而二进制的每四位的和也是十六进制,那么2进制和十六进制之间也是可以很好的准换的。

二进制:100 1101 0010
十六进制:4 D 2
计算方法:同求十进制一样,由于每四位二进制的数和为F,所以不用担心溢出。

二、二进制的表示方式

  • 整数的二进制的表示方式有三种:原码、反码和补码。
  • 正整数的原码、反码和补码相同,而负整数原码、反码和补码不同。

2.1 原码

  • 直接将数值按照正负值的形式翻译成二进制得到的就是原码。
	int a = 11;
	//原码:00000000 00000000 00000000 00001011
	int b = -11;
	//原码:10000000 00000000 00000000 00001011

1.这里需要提示一下,在有符号整数中,原码、反码和补码均有符号位和数值位。
2.符号位,即原码、反码和补码的第一位,0表示正整数,1表示负整数。
3.数值位,即除去原码、反码和补码的第一位,其他的位。
4.而无符号整数,只有数值位,没有符号位。

2.2 反码

  • 原码的符号位不变,将其他数值位取反得到数值位。
	int a = 11;
	//原码:00000000 00000000 00000000 00001011
	//反码:00000000 00000000 00000000 00001011
	int b = -11;
	//原码:10000000 00000000 00000000 00001011
	//反码:11111111 11111111 11111111 11110100

2.3 补码

  • 反码加1得到补码。
	int a = 11;
	//原码:00000000 00000000 00000000 00001011
	//反码:00000000 00000000 00000000 00001011
	//补码:00000000 00000000 00000000 00001011
	int b = -11;
	//原码:10000000 00000000 00000000 00001011
	//反码:11111111 11111111 11111111 11110100
	//补码:11111111 11111111 11111111 11110101

在计算器中,数值都是用补码储存。是因为计算器在使用补码时可以将符号位和数值位统一处理。

2.4 从补码到原码

  • 补码到原码不仅仅可以通过退一步到反码,再退一步到原码的方式。也可以通过补码取反,再加一的方式。
	int a = 11;
	//原码:00000000 00000000 00000000 00001011
	//反码:00000000 00000000 00000000 00001011
	//补码:00000000 00000000 00000000 00001011
	int b = -11;
	//原码:10000000 00000000 00000000 00001011
	//反码:11111111 11111111 11111111 11110100
	//补码:11111111 11111111 11111111 11110101
	//取反:10000000 00000000 00000000 00001010
	//加一:10000000 00000000 00000000 00001011

三、操作符

3.1 算术操作符

+加
-减
*乘
/除
%取模

3.2 移位操作符

3.2.1 左移操作符

左移操作符:<<

  • 了解二进制的表示方式后,左移操作符是将符号位不变,左边丢弃,右边补零。
	int num = 10;
	//原码=反码=补码
	//00000000 00000000 00000000 00001010
	int n = num<<1;
	//00000000 00000000 00000000 00010100

3.2.1 右移操作符

右移操作符:>>

  • 右移操作符分俩种情况:逻辑右移,算数右移。
	int num = -10;
	//原码:10000000 00000000 00000000 00001010
	//反码:11111111 11111111 11111111 11110101
	//补码:11111111 11111111 11111111 11110110
  • 逻辑右移:左边用0填充,右边丢弃
	int num = -10;
	//原码:10000000 00000000 00000000 00001010
	//反码:11111111 11111111 11111111 11110101
	//补码:11111111 11111111 11111111 11110110
	int n = num>>1;
	//右移:01111111 11111111 11111111 11111011
	//此时右移后的码为补码,是再计算机储存的码
	//取反:00000000 00000000 00000000 00000100
	//原码:00000000 00000000 00000000 00000101
	printf("%d",n);//n = 5
  • 算数右移:左边使用原来的符号位,右边丢弃
	int num = -10;
	//原码:10000000 00000000 00000000 00001010
	//反码:11111111 11111111 11111111 11110101
	//补码:11111111 11111111 11111111 11110110
	int n = num>>1;
	//右移:11111111 11111111 11111111 11111011
	//此时右移后的码为补码,是再计算机储存的码
	//取反:10000000 00000000 00000000 00000100
	//原码:10000000 00000000 00000000 00000101
	printf("%d",n);//n = -5

逻辑右移和算数右移取决于编译器的不同。

3.3 位操作符

位操作符有三种:
按位与 &、按位或 |、按位异或 ^
使用时必须位整数。

3.3.1 按位与 &

  • 按二进制与 &,对应的二进制位有0,则为0;俩个同时为1,则为1.
	int num1 = 10;
	//补码:00000000 00000000 00000000 00001010
	int num2 = 6;
	//补码:00000000 00000000 00000000 00000110
	int n = num1 & num2;
	//补码:00000000 00000000 00000000 00000010
	//原码:00000000 00000000 00000000 00000010
	printf("%d",n); //n = 2

3.3.2 按位或 |

  • 按二进制或 |,对应的二进制位有1,则为1;俩个同时为0,则为0.
	int num1 = 10;
	//补码:00000000 00000000 00000000 00001010
	int num2 = 6;
	//补码:00000000 00000000 00000000 00000110
	int n = num1 | num2;
	//补码:00000000 00000000 00000000 00001110
	//原码:00000000 00000000 00000000 00001110
	printf("%d",n); //n = 14

3.3.3 按位异或

  • 按二进制异或 ^,对应的二进制位相同为0,相异为1.
	int num1 = 10;
	//补码:00000000 00000000 00000000 00001010
	int num2 = 6;
	//补码:00000000 00000000 00000000 00000110
	int n = num1 ^ num2;
	//补码:00000000 00000000 00000000 00001100
	//原码:
	printf("%d",n); //n = 12

按位异或特点:
1.a^a=0;
2.0^a=a;
3.异或 ^支持交换律

3.4 赋值操作符

赋值操作符:
=、+=、-=、/=、%=、<<=、>>=、&=、|=、^=

3.5 单目操作符

单目操作符:
!逻辑反
-负值
+正值
&取地址
sizeof操作数类型长度
~二进制按位取反
–前置、后置减减
++前置、后置加加
*间接访问操作符(解引用操作符)
()强制类型转换

3.6 关系操作符

关系操作符:
< 小于、>大于
<=小于等于、>=、
==等于、!=不相等

3.7 逻辑操作符

逻辑操作符:
&& 逻辑与
|| 逻辑或

3.8 条件操作符

条件操作符:
exp1?exp2:exp3

3.8 逗号表达式

逗号表达式:
exp1,exp2,exp3…expn

3.9 下标引用

下标引用符:
数组[];

3.10函数调用

函数调用符:
函数名();

  • 34
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值