操作符详解

57 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

1、二进制简介

1、正数

正数的原码、反码、补码是相同的。 例如十进制数10的32位二进制数 原码:00000000000000000000000000001010
反码:00000000000000000000000000001010
补码:00000000000000000000000000001010
他的原码反码补码一致!

2、负数

例如十进制数-10的32位二进制数
原码:10000000000000000000000000001010
反码:11111111111111111111111111110101 //符号位不变,其他位置01互换 补码:11111111111111111111111111110110 //反码加1

2、左移运算符 <<

int main()
{
	int a = 10;
	int b = a << 1;
	//00000000000000000000000000001010 -补码
	printf("%d\n", b);
	printf("%d\n", a);
	return 0;
}

会发现a=10经过左移运算之后数值变成了原来的二倍等于20赋给了b,a的数值没有改变。
a = 10 = 00000000000000000000000000001010
b = 00000000000000000000000000010100 = 20 image.png

3、右移运算符 >>

int main()
{
	int a = 10;
	int b = a >> 1;
	//00000000000000000000000000001010 -补码
	printf("b=%d\n", b);
	printf("a=%d\n", a);
	return 0;
}

会发现a=10经过右移运算之后数值变成了原来的一半等于5赋给了b,a的数值没有改变。
a = 10 = 00000000000000000000000000001010

b = 00000000000000000000000000010100 = 5

image.png

4、按位与&

int main()
{
	int a = 10;
	int b = 6;
	printf("%d", a&b);
	return 0;
}

10: 00000000000000000000000000001010

6: 00000000000000000000000000000110

10&6: 00000000000000000000000000000010 = 2

image.png

5、按位或 |

int main()
{
	int a = 10;
	int b = 6;
	printf("%d", a|b);
	return 0;
}

10: 00000000000000000000000000001010

6: 00000000000000000000000000000110

10&6: 00000000000000000000000000001110 = 8 + 4 + 2 = 14

image.png

6、按位异或 ^

int main()
{
	int a = 10;
	int b = 6;
	printf("%d", a^b);
	return 0;
}

10: 00000000000000000000000000001010

6: 00000000000000000000000000000110

10&6: 00000000000000000000000000001100 = 8 + 4 = 12 image.png

7、例题

不使用临时变量交换两个数

int main()
{
   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);
   return 0;
}

a=00000000000000000000000000000011

b=00000000000000000000000000000101

a=a^b=00000000000000000000000000000110

b=a^b=00000000000000000000000000000011=5

a=a^b=00000000000000000000000000000101=3 交换完成!!

image.png