前言
本篇文章介绍c语言中的各种操作符以及操作符的运用案例。
一、赋值操作符
赋值操作符用于对变量进行初始化或赋值
名称 | 符号 |
---|---|
赋值 | = |
二、算术操作符
算术操作符是在数学运算中使用的符号,用于执行基本的四则运算,常见算术操作符如下:
名称 | 符号 |
---|---|
加 | + |
减 | - |
乘 | * |
除 | / |
取模 | % |
// 算术操作符
// + - * / %
int main()
{
/除号
//int a = 2;
//double b = 1.0 / 2; //转换成double
//double c = 1 / 2.0;
//printf("%lf %lf", b, c);
// % 取模运算,操作数为必须为整数
int a = 10;
int b = 10 % 3;
printf("%d", b);
return 0;
}
三、移位操作符
操作对象:整型和字符型
前置知识
整数的二进制编码表示由三种:原码、反码、补码
正整数的原码、反码、补码相同
对于负整数,反码 = 原码的最高位不变(符号位不变),其余按位取反
补码 = 反码+1
整数在内存以补码的方式存储
例如 a = 3, a的二进制(32位机器)
a 的原码、反码、补码00000000 00000000 00000000 00000011
b = -5;
b的原码 10000000 00000000 00000000 00000101
b的反码 11111111 11111111 11111111 11111010
b的补码 11111111 11111111 11111111 11111011
名称 | 符号 |
---|---|
左移 | << |
右移 | >> |
左移的运算规则:左边丢弃,右边补0
右移分两种:
1.算术右移:右边丢弃,左边补原符号位
2.逻辑右移:右边丢弃,左边补0
右移由使用的编译器决定采用哪种方式,大部分采用算术右移。
int main()
{
int a = 3;
//00000000 00000000 00000000 00000101
a = 3 << 1;
//00000000 00000000 00000000 00001010
printf("%d\n",a);
int b = -5;
//11111111 11111111 11111111 11111011
b = b >> 1;
//11111111 11111111 11111111 11111101
printf("%d", b);
return 0;
}
四、位操作符
操作对象:整型和字符型
名称 | 符号 |
---|---|
按位(二进制)与运算 | & |
按位(二进制)或运算 | | |
按位(二进制)异或运算 | ^. |
按位(二进制)取反运算 | ~ |
位操作符的案例
- 求一个整数存储在内存中的二进制中1的个数(32位机器)
内存中的二进制其实就是求补码的1的个数
思路:假设这个数为n
步骤一, n = n & 1
步骤二,n = n>> 1
步骤三,重复循环步骤一和步骤二32次并统计1的个数
int count_2scomplement(int number)
{
int count = 0;
int rightMoveTimes = 32;//比较次数
while (rightMoveTimes > 0)
{
if (number & 1)
count++;
number = number >> 1;
rightMoveTimes--;
}
return count;
}
- 或操作符和左移操作符的使用,将某个二进制位置1
题目:假设a = 9,将a的二进制的右边第三位置1
int main()
{
int a = 9;
//00000000 00000000 00000000 00001001
//将右边第3位置1
int b = 1;
//00000000 00000000 00000000 00000001
//将b左移2位
b = b << 2;
//00000000 00000000 00000000 00000100 b
// | 00000000 00000000 00000000 00001001 a
//00000000 00000000 00000000 00001101 a
a = b | a;
printf("a = %d", a);
return 0;
}
- 与操作符和取反操作符的使用,将某个二进制位置0
假设 a = 13,将a的二进制右边第三位置0
int main()
{
int a = 13;
//00000000 00000000 00000000 00001101
//将右边第三个位置0
int b = 1;
//00000000 00000000 00000000 00000001
//b左移2位
b = b << 2;
//00000000 00000000 00000000 00000100
//取反~
b = ~b;
//11111111 11111111 11111111 11111011
a = a & b;
//00000000 00000000 00000000 00001101 a
// & 11111111 11111111 11111111 11111011 b
//00000000 00000000 00000000 00001001
printf("a = %d",a);
return 0;
}
- 利用异或操作符不使用临时变量交换两个变量的值
int main()
{
int a = 3;
int b = 5;
printf("before swap: a = %d b = %d\n", a, b);
//方式一
//局限性:a+b的值可能溢出
/*a = a + b;
b = a - b;
a = a - b;*/
//方式二
//原理: 5^5 = 0 0^5 = 5 ^符合交换律
//局限性:只能用于整数的交换
a = a ^ b; //3^5
b = a ^ b; //3^5^5 = 3^0 = 3
a = a ^ b; //3^5^3 = 3^3^5 = 0^5 = 5
printf("after swap: a = %d b = %d", a, b);
return 0;
}
五、关系操作符
名称 | 符号 |
---|---|
大于 | > |
小于 | < |
等于 | == |
大于等于 | >= |
小于 等于 | <= |
不等于 | != |