一、算术操作符
加、减、乘、除、取余;
整数除法与浮点数除法;
浮点数除法—除号两端必须有一个浮点数(小数);
float a = 3.0 / 2;
printf("%f\n", a);
return 0;
备注:
3.0编译器默认是 double 类型,转化为 float 可能会丢失精度
解决办法:1.在3.0后面加一个 f ,将其转化为浮点型 2.打印格式为 lf 类型;
对于取余操作符来说,取余符号两端必须是整数;
二、移位操作符
对二进制位进行操作,切记不要出现移动负数位;
左移操作符:左边丢弃,右边补零
右移操作符:
1.算术右移—右边丢弃,左边补原符号位(正0负1)
2.逻辑右移—右边丢弃,左边补0;
整数的二进制形式有三种:
1.原码:直接根据数值写出的二进制序列就是原码;
2.反码:原码的符号位不变,其他位按位取反就是反码;
3.补码:反码+1,就是补码;
注意:整数的原码、反码、补码都是一样的,为二进制原码的形式;
在计算机存储的形式是补码
以 -1 为例:
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
int d = -1;
//原码:10000000 00000000 00000000 00000001
//反码:11111111 11111111 11111111 11111110
//补码:11111111 11111111 11111111 11111111
int e = d >> 1;
printf("%d\n",e); //结果为-1,证明编译器采用的是算术右移规则;
编译器采用的是算术右移规则
三、位操作符
两个整数才可以进行位操作;
&:按位与—对应的二进制位—全真才真
|:按位与—对应的二进制位—全假才假
^:按位异或—对应的二进制位进行异或(同0异1)
代码示例:
int f = 5;
//00000000 00000000 00000000 00000101
int g = 9;
//00000000 00000000 00000000 00001001
int h = f & g;
//00000000 00000000 00000000 00000001
int j = f | g;
//00000000 00000000 00000000 00001101
int k = f ^ g;
//00000000 00000000 00000000 00001100
printf("%d\n", h);
printf("%d\n", j);
printf("%d\n", k);
应用–示例:交换两个整数的值,不能使用第三个变量;
方法一:
a=a+b;
b=a-b;
a=a-b;
但是有一个问题是:int 类型数据有一定限制,数据足够大时,会有数据溢出问题;
方法二:
采用异或的方法来处理
int m = 5;
//00000000 00000000 00000000 00000101
int n = 3;
//00000000 00000000 00000000 00000011
printf("%d ", m);
printf("%d \n", n);
m = m ^ n;
//00000000 00000000 00000000 00000110
n = m ^ n;
//00000000 00000000 00000000 00000101
m = m ^ n;
//00000000 00000000 00000000 00000011
printf("%d ", m);
printf("%d \n", n);
return 0;
总结:第一个数异或第二个数的值赋给第一个数,拿第一个数异或第二个数可以还原第一个数,将其赋给第二个数,拿第一个数(第二次异或的结果)异或第一个数(第一次异或的结果)可以得到原来第二个数,将其赋给第一个数;
两个相同数字异或为零,零和一个数异或结果是原来的数;
特性像是可以复原一个数一样;
编写代码实现:查找一个整数在内存中存储的二进制序列有几个1
1.用这个数与上1 2.右移这个二进制序列
int q = 0;
int count = 0;
printf(