操作符详解

本文详细介绍了计算机编程中的操作符分类,包括算术、移位、位、赋值、单目、关系和逻辑运算,以及进制转换方法,如2进制转10进制、8进制和16进制,同时涵盖原码、反码和补码的概念,以及移位、位操作符的实例和优先级规则。
摘要由CSDN通过智能技术生成

目录

1、操作符分类

2、进制转换

2.1    2进制转10进制

2.1.1    10进制转2进制

2.2    2进制转8进制

2.3    2进制转16进制

3、原码,反码,补码

4、移位操作符

4.1 左移操作符

4.2 右移操作符

5、位操作符

 5.1 例题

方法一:

方法二: 

5.2例题

方法一:

 方法二:

6、逗号表达式

7、下标引用操作符,函数调用操作符

8、优先级


1、操作符分类

算术操作符:+、-、*、/、%

移位操作符:<<、>>

位操作符:&、|、^、~

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

单目运算符:!、++、--、&、|、*、~、+、-、sizeof

关系运算符:>、>=、<、<=、==、!=

逻辑操作符:&&、||

条件运算符:?:

逗号表达式:,

下标引用:[]

函数调用:()

2、进制转换

 我们常说的2进制,8进制,10进制,16进制其实是数值不同的表达形式;

如:15的不同进制表示:

2进制:1111

8进制:17

10进制:15

16进制:F

我们日常生活中大部分使用的是10进制;

1、10进制中满10进1

2、10进制中的数字每一位都是由0~9组成

同理,其他进制也是如此;

2进制:

(1)满2进1

(2)2进制中的数字每一位都是由0~1组成

8进制:

(1)满8进1

(2)8进制中的数字每一位都是由0~7组成

16进制:

(1)满16进1

(2)16进制中的数字每一位都是由0~9和a,b,c,d,e,f组成

(其中a表示10,b表示11,c表示12,d表示13,e表示14,f表示15)

其中8进制一般是0开头,18进制一般是0x开头

int main()
{
	int a = 0xF;//十六进制
	int b = 012;//八进制
	printf("%d\n", a);
	printf("%d", b);
}

有了以上基础,我们就可以进一步去掌握进制转换

2.1    2进制转10进制

对于一个二进制:1101,它的每一位权重,从右往左:2^0,2^1,2^2,2^3……借助下面的表格对1101的每一位权重进行理解。

2进制的位1101
权重2^32^22^12^0
权重值8421
求值1*8+1*4+0*2+1*1=13

2.1.1    10进制转2进制

2.2    2进制转8进制

2进制转8进制也可以利用权重的方法来计算,下面是一个比较简单的方法;

对于二进制:01101011

总结:

从右边序列低位开始向左,每3个二进制会换算出一个8进制,剩余不足3个的,直接换算;

2.3    2进制转16进制

还是以二进制:01101011为例,与转8进制类似,只不过这个是每4个二进制换算出一个16进制;

3、原码,反码,补码

整数二进制表示方法:原码,反码,补码

有符号整数:三种表示方法均匀符号位

(其中’0‘表示正,’1‘表示负)

原码:将一个整数转换成二进制形式,就是其原码。

反码:对于正数,它的反码就是其原码(原码和反码相同);负数的反码是将原码中除符号位以外的所有位(数值位)取反,也就是 0 变成 1,1 变成 0。

补码:对于正数,它的补码就是其原码(原码、反码、补码都相同);负数的补码是其反码加 1

我们根据下面的代码来理解和求一个数的原码,反码,补码;

int main()
{

	int num1 = 10;
	//10是存放在整型变量num1中,占4个字节,32个bite位
	//0 0000000000000000000000000001010------原码
	//0 0000000000000000000000000001010------反码
	//0 0000000000000000000000000001010------补码
	int num1 = -10;
	//-10是存放在整型变量num1中,占4个字节,32个bite位
	//1 0000000000000000000000000001010------原码
	//1 1111111111111111111111111110101------反码(符号位不变,其他位全部取反)
	//1 1111111111111111111111111110110------补码(反码加1)
}

4、移位操作符

移位操作符包括:<<(左移操作符),>>(右移操作符)

它们只能对整数进行移位操作;

4.1 左移操作符

简单概括一下就是:左边抛弃,右边补0

举例讲解:

int main()
{
	int n = 10;
	int m = n << 1;//左移一位
	printf("m=%d\n", m);
	printf("n=%d\n", n);
}

 n=10时:

4.2 右移操作符

移动规则:右移运算分成两种:

1.逻辑右移:左边用0补充,右边抛弃

2.算术右移:左边用原该值的符号位补充,右边抛弃

其用哪一种运算取决于编译器,大部分编译器采用的是算术右移;        

int main()
{
	int n = -10;
	int m = n >> 1;//右移一位
	printf("m=%d\n", m);
	printf("n=%d\n", n);
}

注意:

对于移位运算符,不能移动负数位:

int n=10;
n>>-1;//错误写法

5、位操作符

位操作符包括:

&:按位与;只要有0就是0,全为1才是1

|:按位或;有一个1就是1

^:按位异或;相同为0,不同为1

~:按位取反;全部取反,符号位也要取反

注:位操作符操作的都是二进制位,操作数必须是整数;

举例来解释一下:

int main()
{
	int a = 3;
	int b = -5;
	int c = a & b;
	printf("c=%d\n", c);
	//00000000000000000000000000000011 ------3的补码
	
	//10000000000000000000000000000101 ------ -5的原码
	//11111111111111111111111111111010 ------ -5的反码
	//11111111111111111111111111111011 ------ -5的补码
	//00000000000000000000000000000011 ------3的补码
	//按位与运算:只要有0就是0,全为1才是1
	//00000000000000000000000000000011 

	c = a | b;//按位或运算
	//有一个1就是1
	//11111111111111111111111111111011 补码
	//10000000000000000000000000000101 原码
	//------ - c = -5
	printf("c=%d\n", c);

	c = a ^ b;//按位异或运算
	//相同为0,不同为1
	//11111111111111111111111111111000  补码
	//10000000000000000000000000001000  原码
	//----c=-8
	printf("c=%d\n", c);
}
int main()
{
	int a = 1;
	int b = ~a;//按位取反(全部取反,符号位也要取反)
	printf("b=%d\n", b);
	//00000000000000000000000000000001   a的补码
	//11111111111111111111111111111110   a取反==>b
	//10000000000000000000000000000010   b的原码
	//---b=-2
}

 5.1 例题

不创建临时变量(第三个变量),实现两个整数的交换。

方法一:

	int a = 3;
	int b = 5;
	printf("a==%d,b==%d\n", a, b);

	a = a + b;
	b = a - b;
	a = a - b;
	printf("a==%d,b==%d\n", a, b);

方法二: 

	a = a ^ b;
	b = a ^ b;//a^b^b==a^0==a(还是原来的a)
	a = a ^ b;//a^b^a==b^0==b
	printf("a==%d,b==%d\n", a, b);
	//异或运算:
	// a^a=0;
	//0^a=a;

5.2例题

 求一个整数在内存中的二进制1的个数

方法一:

若a:00000000000000000000000000001010

1:00000000000000000000000000000001

a&1:00000000000000000000000000000000

若a:00000000000000000000000000000101

1:00000000000000000000000000000001

a&1:00000000000000000000000000000001

由此可知:当一个数的二进制的最右边为1时,这个数&1的结果是1

                  当一个数的二进制的最右边为0时,这个数&1的结果是0

int main()
{
	int a;
	scanf("%d", &a);
	int sum = 0;
	for (int i = 1; i <= 32; i++)
	{
		if (a & 1 == 1)sum++;
		a = a>>1;//依次右移一位
	}
	printf("%d", sum);
}

 方法二:

我们先看a&(a-1)这个表达式有什么规律?

假设一个数a为15:

a:1111

a-1:1110

a&(a-1):1110

a:1110

a-1:1101

a&(a-1):1100

a:1100

a-1:1011

a&(a-1):1000

a:1000

a-1:0111

a&(a-1):0000

由此可知:a&(a-1)这个表达式每次都可以去掉二进制中数值为1的一位

int main()
{
	int a;
	scanf("%d", &a);
	int sum = 0;
	while (a)
	{
		a = a & (a - 1);
		sum++;
	}
	printf("%d", sum);
}

6、逗号表达式

逗号表达式就是用逗号隔开的多个表达式,从左到右,依次执行,整个表达式的结果是最后一个表达式的结果;

int main()
{
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);
	printf("%d\n", c);
}

7、下标引用操作符,函数调用操作符

int add(int x, int y)
{
	return x + y;
}
int main()
{
	int arr[10] = { 0 };
	arr[5] = 9;//[]----下标引用操作符
	//arr和5是两个操作数

	int c = add(1, 2);//()函数调用操作符,函数名和参数就是操作数
	//test() 函数名就是操作数,最少有1个操作数
}

注意:

sizeof并不是函数,而是操作符;

int main()
{
	int a = 10;
	printf("%d\n", sizeof(a));
	printf("%d", sizeof a );
}

sizeof(a)和sizeof a 效果相同;且()可以去掉,说明sizeof并不是函数,因为函数的()不可以省略。

8、优先级

部分优先级(由高到低)

圆括号:()

自增自减运算符:++,--

单目运算符:+和-

乘除:*、/

加减:+、-

关系运算符:<、>

赋值运算符:=

逗号表达式最低

以上就是有关操作符的相关内容,希望有所帮助!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值