文章目录
1.算术操作符
//打印小数
printf("%f",5/3.0);
//分子分母至少一位用小数表示
打印2位小数位:
%.2f
scanf()函数输入浮点数:
//float类型
%f
//double类型
%lf
2.移位操作符
左移操作符:左边丢弃,右边补0
右移操作符:
1>算术右移:右边丢弃,左边补原来符号位
2>逻辑右移:右边丢弃,左边补0
注意:在不溢出的前提下(如8位的范围是-128-127),算术右移和逻辑右移的结果一样
#include <stdio.h>
int main()
{
int a = 2;
int b = a << 1;
printf("%d", b);
return 0;
}
将a二进制位向左移动一位,000000000000000000000000000000010
即4
#include <stdio.h>
int main()
{
int a = -1;
int b = a >> 1;
printf("%d", b);
return 0;
}
-1的补码全为1,这里进行的是算术右移
3.位操作符
& 按位与==(对应二进制位只要有0,就为0)
| 按位或(对应的二进制有1则为1,无1则为0)
^ 按位异或(对应的二进制位相异为1,相同为0)
& 按位与
对应2进制位只要有一个为0即为0
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a & b;
printf("%d", c);
return 0;
}
a的二进制位:00000000000000000000000000000011
b的二进制位:00000000000000000000000000000101
则a按位与b : 00000000000000000000000000000001
| 按位或
对应的二进制有1则为1,无1则为0
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a | b;
printf("%d", c);
return 0;
}
则c=7
^ 按位异或
对应的二进制位,相异为1,相同为0
如上,c为6
进行按位操作的两个数必须是整数
例题
不能引入变量,用异或
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d", a, b);
return 0;
}
根据相同为0,那么b^b=0
又根据相异为1,所以a^0=a
所以b=a^ b ^b 即把a的值传给b
同理a=b^ a ^a 将b的值传给a
例题:
查找一个数的二进制位中1的数量
#include <stdio.h>
int main()
{
int m;
int c=0;
scanf("%d", &m);
int count = 0;
for (int i = 0;i < 32;i++)
{
c = m & 1;
m = m >> 1;
if (c == 1)
{
count++;
}
}
printf("%d", count);
return 0;
}
法2
思路:采用相邻的两个数据进行按位与运算
举例:
9999:10 0111 0000 1111
第一次循环:n=9999 n=n&(n-1)=9999&9998= 9998
第二次循环:n=9998 n=n&(n-1)=9998&9997= 9996
第三次循环:n=9996 n=n&(n-1)=9996&9995= 9992
第四次循环:n=9992 n=n&(n-1)=9992&9991= 9984
第五次循环:n=9984 n=n&(n-1)=9984&9983= 9728
第六次循环:n=9728 n=n&(n-1)=9728&9727= 9216
第七次循环:n=9216 n=n&(n-1)=9216&9215= 8192
第八次循环:n=8192 n=n&(n-1)=8192&8191= 0
可以观察下:此种方式,数据的二进制比特位中有几个1,循环就循环几次,而且中间采用了位运算,处理起来比较高效
*/
int NumberOf1(int n)
{
int count = 0;
while(n)
{
n = n&(n-1);
count++;
}
return count;
}
4.赋值操作符
-=
+=
*=
/=
%=
<<=
<<=
&=
|=
5.单目操作符
!
+
–
&
sizeof
~
++
*
类型 (强制类型转换)
~将一个数的二进制位取反(-1补码全为1)
*间接访问操作符(解引用操作符)
sizeof意义:操作数的类型长度,字节为单位
#include <stdio.h>
int main()
{
int a = 0;
char arr[10] = {0};
int brr[10] = {0};
printf("%d\n", sizeof(a)); //计算a所占内存大小,单位字节
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a); // sizoef不是而是操作符
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(int [10]));//int [10]是数组brr类型
return 0;
}
结果分别为:4 4 4 10 40
short将整形截断为短整形,故答案是2,sizeof括号中的表达式是不参与运算的,其中的运算在编译就完成了,而赋值在运行阶段运行,运行时关于编译的代码已经没有了
传过去是首元素地址,用指针接收,所以不管char int 类型,都是指针,都是4/8字节
强制类型转换,将3.14转为整形,但打印结果还是3
6.关系操作符
<
<=
!=
>
>===
编程中=和==用错的错误,
比较两个字符串相等用strcmp( , )=0,并引头文件<string.h>
7.逻辑操作符
&& 逻辑与
|| 逻辑或
&& i=a++,a=0,那么后续不用在计算了,1234
|| 同理,为真则不必计算了,1334
8.条件操作符
三目表达式
exp1 ? exp2 : exp3
条件1成立,则返回2,否则返回3
#include <stdio.h>
int main()
{
int max;
int a = 3;
int b = 0;
b = (a > 5 ? 1 : -1);
max = (a > b ? a : b);
printf("%d\n", b);\\-1
pirntf("%d", max);\\3
return 0;
}
9.逗号表达式
exp1 , exp2 , exp3 , …expn