C语言的操作符有以下几种:
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号操作符
- 下标引用,函数调用和结构成员
本次解释一下算术操作符,移位操作符,位操作符
算术操作符
一般分为五种:+ - * / %
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 1+1; // +
printf("和是%d\n", a);
int b = 2 - 1; // -
printf("差是%d\n", b);
int c = 2 * 2; // *
printf("积是%d\n", c);
float d = 6.0 / 5; // 1:/
printf("a=%f\n", d);
float e = 6 / 5.0; // 2:/
printf("b=%f\n", e);
float f = 6.0 / 5.0; // 3:/
printf("c=%f\n", f);
float g = 6.0f / 5.0f; // 4:/
printf("d=%f\n", g);
return 0;
}
移位操作符
移位操作符是以二进制来算的
- <<左移操作符
- >>右移操作符
把整数 2 左移一位得( )?
x86是32位,x64是64位,这里以32位算
首先把 2 换算成二进制:
00000000000000000000000000000010,按照左移移出位舍弃,空位添0,那么是这样的
0000000000000000000000000000010,最左边舍弃一位(可以拿尺子比一下),最右边少了一位所以右边加一个0得:
00000000000000000000000000000100,换算为十进制是 4,所以括号处填 4
把整数 4 右移一位得( )?
首先把 4 换算成二进制:
00000000000000000000000000000100,按照右移移出位舍弃,空位添0,那么是这样的
0000000000000000000000000000010,最右边舍弃一位(可以拿尺子比一下),最左边少了一位所以左边加一个0得:
00000000000000000000000000000010,换算为十进制是 2,所以括号处填 2
原码,反码,补码
原码:整数的二进制位
反码:符号位不变,其他位按位取反 (最高位“1”为负数,“0”为正数)
补码:反码+1
比如:
原码:10000000000000000000000000000001 -1的二进制
反码:11111111111111111111111111111110 取反
补码:11111111111111111111111111111111 反码+1
所以 -1 的的补码是 0
算术右移补原符号位,逻辑右移补0
位操作符
& 按位与 按(2进制)位与 0+1=0 1+1=1
| 按位或 按(2进制)位或 0+1=1 1+1=1
^ 按位异或 按(2进制)位异或 相同为0,相异为1
按位与
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a & b;
printf("c = %d", c);
return 0;
}
3 = 00000000000000000000000000000011
5 = 00000000000000000000000000000101
c = a & b = 00000000000000000000000000000001
结果c = 1
按位或
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a | b;
printf("c = %d", c);
return 0;
}
3 = 00000000000000000000000000000011
5 = 00000000000000000000000000000101
c = a | b = 00000000000000000000000000000111
结果c = 7
按位异或
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a ^ b;
printf("c = %d", c);
return 0;
}
3 = 00000000000000000000000000000011
5 = 00000000000000000000000000000101
c = a ^ b = 00000000000000000000000000000110
结果c = 6
例题:有两个整数 3 和 5 ,在不创建第三个变量的情况下交换位置。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("交换前a=%d b=%d", b, b);
a = a + b; //3=3+5
b = a - b; //5=3-5
a = a + b; //3=3+5
printf("交换后a=%d b=%d", b, b);
//结果:交换前a=3 b=5
//交换后a=5 b=3
return 0;
}
这种方法有bug,数值太大会溢出!!!
可以选择这种方法:异或一下
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("a=%d b=%d", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d b=%d", a, b);
return 0;
}
所以这种方法更为简便,同样可以不创建第三个变量交换位置