除法操作符;
1.‘/’除法运算符两边都是整数时,操作结果也是整数;当两边至少有一个小数时,算出来的是小数;
2.代码:
int main()
{
double z = 7 / 2;//整数除法算出的是3,打印的时候跟类型无关;
double x = 7.0 / 2;//小数除法必须至少有一个是小数;
printf("%lf\n", z);//除法中被除数不能为零;
printf("%lf\n", x);
return 0;
}
3.运行结果:
取模操作符;
1.取模操作符只能在整数间使用;
2.代码:
int main()
{
int x = 7 % 2;
/*double y = 7.0 % 2;*///取模只能在整数间应用;
printf("%d", x);
return 0;
}
3.运行结果:
移位操作符;
1.正整数原码反码补码都一样;负数需要计算,反码是符号位不变,其他位按位取反,补码是反码加1;整数在内存中存储的是补码;计算的时候也是使用补码计算;移位移动的是补码的二进制;
2.算数右移:右边丢去,左边补符号位;逻辑右移:右边丢弃,左边补零;一般采用算数右移;左移操作符,左边丢弃,右边补零。
3.代码:
右移:
#include<stdio.h>
int main()
{
int a = 15;
int b = -15;
a = a >> 1;//00000000000000000000000000000111
//a自身没变;
b = b >> 1;//11111111111111111111111111110001>>11111111111111111111111111111000>>10000000000000000000000000000111
printf("%d ", a);//当前编译器是用的算数右移;
printf("%d ", b);
return 0;
}
左移:
int main()
{//{
// int a = 6;//00000x00110 6
// int b = a << 1;//00000x01100 12
int a = -6;//10000X0000110 11111X1111001 11111X1111010;
int b = a << 1;//1111X11110100 -1 1111X11110011 取反1000x00001100 =-12
printf("%d ", a);//a=a<<1 ====a<<=1;
printf("%d ", b);
return 0;
}
4.运行结果:
右移:
左移:
按位操作符;
1.按位与:& 两个为1才是1 按位或:| 有一个1就是1 按位异或:^ 对应的二进制位相同为0,相异为1;
2.计算的时候用补码算,算出来的都是补码,负数要注意化为源码;
3.代码:
#include<stdio.h>
int main()
{
int a = 3;
//00000000000000000000000000000011
int b = -5;
//10000000000000000000000000000101
//11111111111111111111111111111010
//11111111111111111111111111111011
int c = a & b;
//00000000000000000000000000000011 3
int d = a | b;
//11111111111111111111111111111011
//11111111111111111111111111111010
//10000000000000000000000000000101 -5
int e = a ^ b;
//11111111111111111111111111111000
//11111111111111111111111111110111
//10000000000000000000000000001000 -8
printf("%d %d %d", c, d, e);
return 0;
}
4.运行结果;
异或实现数字交换;
1.异或支持交换率的;自己与自己异或是0,与零异或是自己;
2.a^b^a=b;
3.代码:
int main()
{
int a = 3;
int b = -5;
int e = a ^ 0;// 3
int d = b ^ 0;// -5
int c = a ^ a;// 0
a = a ^ b;
b = a ^ b;//b=a
a = a ^ b;//a=b
printf("%d %d %d %d %d\n", e, d, c, a, b);
return 0;
}
4.运行结果;
计算一个数在内存中‘1’的个数;
1.利用移位操作符和按位与操作符来算;
2.将数和1按位与,如果是1,则这个位是1,如果是0,则这个位是0;运算完后,按位向右移,再与1与;利用for循环,一直移动31次,全部检验完毕;
3.代码:
int main()
{
int a = 3;//00000000000000000000000000000011
int b = 1;
int i = 0;
int cunt=0;
for (i = 0;i < 32;i++)//总共移动31位就完成全部
{
int c = a >> i;
int d = c & b;
if (1 == d)
{
cunt++;
}
else
{
}
}
printf("共%d个1\n", cunt);
return 0;
}
4.运行结果;
逻辑操作符;
1.&&操作符左边是0的话就不再往下计算;||操作符左边是1的话就不再往下计算;
2.代码·:
int main()
{
int i = 0;
int j = 0;
int a = 1;
int b = 2;
int c = 3;
int d = 4;
//i = a++ && ++c && d++;//a先用后加,&&左边是零,右边就不计算了
//printf("%d %d %d %d\n", a, b, c, d);//1 2 3 4
j = a++ || ++c || d++;
printf("%d %d %d %d\n", a, b, c, d);//a先用后加,a已经为真,||左边为真,后面的不用计算; 2 2 3 4
return 0;
}