2.1数学运算
1.C语言基本运算符:
运算符 | 说明 | 举例 |
---|---|---|
= | 赋值运算符 | a = b; |
+、-、*、/、() | 基本运算符 | a = (b + c) * d; |
% | 求余运算符 | a = b % 2; |
&、|、^、~ | 位运算(imp.) | a = ~b | c; |
<<、>> | 左移和右移 | a = b >> 2; |
(1)位运算:一种二进制位下的高速运算
-
按位与 &:先将左右两边的数表示成二进制的形式,对应二进制位上进行的一种运算,a与b必须同时为真
-
按位或 |:先将左右两边的数表示成二进制的形式,对应二进制进位上行的一种运算,a与b有一边为真即可
-
异或运算 ^:先将左右两边的数表示成二进制的形式,对应二进制位上进行的一种运算,相同则为0,不同则为1(逆运算满足交换律)
注意:
①由a ^ b = c 可得 c ^ a = b; c ^ b = a;
②n ^ n = 0 ; 0 ^ n = n;
-
按位取反 ~:
(2)右移和左移:将数字转换为二进制,然后向左or右移动(重难点理解)
- 左移 <<:等价于二进制数整体乘2
- 右移 >>:等价于二进制数整体除2下取整(补原数字的符号位)
2.C语言中的数学函数库:
常用函数 | 说明 |
---|---|
pow(a, n) | 指数函数 |
sqrt(x) | 开平方函数 |
ceil(x) | 上取整函数 |
floor(x) | 下取整函数 |
abs(x) | 整数绝对值函数(引入stdlib.h) |
fabs(x) | 实数绝对值函数 |
log(x) | 以e为底对数函数 |
log10(x) | 以10为底对数函数 |
acos(x) | 三角函数 |
1.pow函数
(1)头文件:math.h
(2)原型:double pow(double a, double b);
2.sqrt函数
(1)头文件:math.h
(2)原型:double sqrt(double x);
3.ceil函数
(1)头文件:math.h
(2)原型:double ceil(double x);
4.floor函数
(1)头文件:math.h
(2)原型:double floor(double x);
5.abs函数
(1)头文件:stdlib.h
(2)原型:int abs(int x);
6.fabs函数
(1)头文件:math.h
(2)原型:double fabs(double x);
7.log函数
(1)头文件:math.h
(2)原型:double log(double x);
(3)返回值:loge(x)
8.log10函数
(1)头文件:math.h
(2)原型:double log10(double x);
(3)返回值:log10(x)
//求数字n的数字位数:floor(log10(n)) + 1
9.acos函数
(1)头文件:math.h
(2)原型:double acos(double x);
(3)注意:x为角度的弧度值
注意:
- 不同于其他math函数,abs(absolute)函数需要引入stdlib.h库;
- 三角函数、对数函数返回值、四舍五入函数都是双精度浮点值;
注:极客学院c程序设计参考:http://wiki.jikexueyuan.com/project/c/
3.代码演示:
- 位运算代码演示(位运算只支持映射成整型值的数据的运算)
//1.循环输入实现
#include <stdio.h>
int main(){
int n;
while(~scanf("%d", &n)){
printf("n = %d", n);
}
return 0;
}
/*
~:对scanf函数的返回值(-1)进行按位取反
(1)计算机对于负数用补码表示
(2)补码 = 反码 + 1
(3)反码 = ~源码
-1 = (111...111)32个
*/
//2.判断奇偶数
#include <stdio.h>
int main(){
int n;
while(~scanf("%d", &n)){
//if(n % 2){...}
if(n & 1){
printf("%d is even\n", n);
}else{
printf("%d is odd\n", n);
}
}
return 0;
}
/*
n & 1:在判断奇偶数时等价于 (n % 2)
(1)二进制数最后一位为0:偶数、二进制最后一位为1:奇数
//3.交换变量值
#include <stdio.h>
int main(){
int a = 3, b = 4;
printf("a = %d, b = %d\n", a, b);
a ^= b; //int temp = a;
b ^= a; //a = b;
a ^= b; //b = temp;
printf("swap: a = %d, b = %d\n", a, b);
return 0;
}
/*
temp = a ^ b
a ^= b : a = a ^ b
b ^= a : b = b ^ a = b ^ (a ^ b) = a
a ^= b : a = a ^ b = (a ^ b) ^ a = b
*/