目录
前言
操作符又称为运算符。作为运算对象的变量或者常量称为操作数。C语言中的操作符可以分为算术运算符、关系运算符、逻辑运算符、位运算符等。
一、操作符
c语言中 操作符的分类
• 算术操作符: + 、- 、* 、/ 、%
• 移位操作符: << >>
• 位操作符: & | ^ `
• 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
• 单⽬操作符: !、++、--、&、*、+、-、~ 、sizeof、(类型)
• 关系操作符: > 、>= 、< 、<= 、 == 、 !=
• 逻辑操作符: && 、||
• 条件操作符: ? :
• 逗号表达式: ,
• 下标引⽤: []
• 函数调⽤: ()
• 结构成员访问: . 、->
1.1 算术操作符
+ -就是我们生活中常见的加减操作
a = 2;
b = 3
c = a+b;// c=3+2=5
d = a-b;// c=2-3=-1
a = 2;
b = 3;
c = a*b; //c=2x3=6
/与我们熟悉的除法有点不同
当两端都是整数时,返回值也是整数(省去小数部分)
得两端至少有一个浮点数时,则返回浮点数
a = 6;
b = 4;
printf("%d",a/b) //结果为2
a = 6.0;
b = 4;
printf("%f",a/b) //结果为2.5000000
%是取余操作符,用来计算余数的
a = 6;
b = 4;
c = a%b; // 6/4商1余2 所以c=2;
在讲后面的移位操作符和位操作符前,我们先来了解一下⼆进制的和进制转换的知识
二进制和进制转换
15的2进制:1111
15的8进制:17
15的10进制:15
15的16进制:F
其中我们最熟悉的可能是十进制的了,其实在生活中我们也有很多进制。
比如说60分钟为1个小时,7天为一周,1024MB等于1G等等
上面这些例子都有一个共同点,就是逢多少进1,比如说逢60分钟进为1个小时,逢7天进为1周。
二进制也是这样的,逢二进1,比如说二进制中1 为001,2为001+001结果等于002,但是二进制逢二进1,所以往前进1变为010。
⼆进制的规则
2进制转10进制
10进制转2进制数字
10进制可以通过连除2来转换为二进制数,所得余数从最后往前就是二进制数字了
2进制转8进制
2进制转16进制
原码、反码、补码
1.2 移位操作符
#include <stdio.h>
int main()
{
int num = 10;
int n = num<<1;
printf("n= %d\n", n);
printf("num= %d\n", num);
return 0;
}
运行结果
//二进制表示
00000000000000000000000000001010 //10
//左移操作
0 00000000000000000000000000010100 //20
//左边抛弃右边补零
图解
>> 右移操作符
#include <stdio.h>
int main()
{
int num = 10;
int n = num>>1;
printf("n= %d\n", n);
printf("num= %d\n", num);
return 0;
}
注意:对于移位运算符,不要移动负数位,这个是标准未定义的。
1.3 位操作符
位操作符:&、|、^、~
注:他们的操作数必须是整数。
&按位与(有0为0,没0为1):
n = -3;//11111101 补码
m = 5;//00000101 补码
n & m = //00000101 补码
//所以等于5
|按位或者(有1为1,没1为0):
n = -3;//11111101 补码
m = 5;//00000101 补码
n | m = //11111101 补码
//所以等于-3
^按位异或(相同为0,不同为1):
n = -3;//11111101 补码
m = 5;//00000101 补码
n | m = //11111000 补码
//所以等于-8
~按位取反
n = 00000000;
~n = 11111111;//-1
-1的补码就是11111111
下面我们来看看两道例题:
a ^ a = 0;
a ^ 0 = a ;
这样我们就可以完成代码了:
int main() {
int a, b = 0;
scanf("%d%d", &a, &b);
printf("a=%d,b=%d\n", a, b);
a = a ^ b;
b = a ^ b; //b=a^b^b=a
a = a ^ b; //a=a^b^a=b
printf("a=%d,b=%d\n", a, b);
}
2.求⼀个整数存储在内存中的⼆进制中1的个数。
方法一
#include <stdio.h>
int main()
{
int num = 10;
int count= 0;//计数
while(num)
{
if(num%2 == 1)
count++;
num = num/2;
}
printf("⼆进制中1的个数 = %d\n", count);
return 0;
}
但上述代码还存在一些问题:比如输入-1,结果却是0,显然不对。所以我们需要换一种方式。
方法二
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
for(i=0; i<32; i++)
{
if( num & (1 << i) )//把1一直左移,循环32次,如果该位置为1则按位余不为零
count++;
}
printf("⼆进制中1的个数 = %d\n",count);
return 0;
}
现在我们来输入-1看看:
结果就对了,那还可不可以再简化呢?
方法三
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while(num)
{
count++;
num = num&(num-1);
}
printf("⼆进制中1的个数 = %d\n",count);
return 0;
}
num = num&(num-1)可以依次去掉num中的1。
1.4 单目操作符
单目操作符:!、++、--、&、*、+、-、~ 、sizeof、(类型)
单目操作符指的是只含有一个操作数。
在之前文章中有介绍,可以去前面看看。
1.5 逗号表达式
exp1, exp2, exp3, …expN
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
其中c为13 c=b
a = get_val();
count_val(a);
while (a > 0)
{
//业务处理
a = get_val();
count_val(a);
}
如果使⽤逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
//业务处理
}
1.6 下标访问[]、函数调用()
int arr[10]={1,2,3,4,5,6,7,8,9,10]
//arr[3] = 4;//[]下标访问
函数调用()
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //这⾥的()就是作为函数调⽤操作符。
test2("hello bit.");//这⾥的()就是函数调⽤操作符。
return 0;
}
本文章,讲了一些常见的操作符和二进制的基本概念
希望对你有所帮助