操作符分类:
算数操作符:+ - * / %
//算数操作符
// int main()
// {
// // /除法 1.整数除法(除号两端都是整数) 2浮点数除法,除号的两端只要有一个小数就执行小数除法
// // 除法中,除数为0
// int a = 7 / 2;
// printf("%d\n",a); //3
// double b = 7 / 2;
// printf("%lf\n",b); //3.000000
// double c = 7 / 2.0;
// printf("%lf\n",c); //3.500000
// int d = 0;
// int e = 5 / d; //除数不可为0,编译器会报错
// printf("%d\n",e);
// return 0;
// }
int main()
{
int a = 17 % 8; //% 得到数整数的余数
//int b = 17.0 % 8.0; // %取模操作符的两个操作数必须都是整数才行
printf("%d\n",a);
return 0;
}
移位操作符:<< >>
//移位操作符
// <<左移操作符
// >>右移操作符
//注意:以为操作符的操作数只能是整数 移动的是二进制
int main()
{
//int a = 15;//00000000000000000000000000001111 -原码 //00000000000000000000000000001111 -反码 //00000000000000000000000000001111 -补码
//int c = -15; //10000000000000000000000000001111 -原码 //11111111111111111111111111110000 -反码(原码的符号位不变,其他位按位取反) 11111111111111111111111111110001 -补码(反码+1就是补码)
//int b = a >> 1;//移动的就是a中的二进制信息 //0000000000000000000000000000111 - 7
//右移:算术右移(右边丢弃,左边直接补原来的符号位) 逻辑右移(右边丢弃,左边直接补0)
// C语言没有明确规定是算术右移还是逻辑右移
//int c = a << 1;//00000000000000000000000000011110
//整数的二进制表示形式 : 原码 反码 补码
//正整数的原码、反码、补码是相同的
//负的整数原码、反码、补码是要计算的
//首先不管是正整数还是负整数都可以写出二进制原码 1.根据正负直接写出的二进制序列就是原码
//1个整型是4个字节 = 32bit位
//整数在内存中存储的是补码
//计算的时候也是使用补码计算的
// printf("%d\n",b); //7
// printf("%d\n",c); //30
// int d = -15; //10000000000000000000000000001111
// int e = d >> 1;//11111111111111111111111111110001 -> 11111111111111111111111111111000 -> 11111111111111111111111111110111 ->00000000000000000000000000001000
// printf("%d\n",e);
//!移位操作符不要移负数哦
int a = 6;// 110
int b = a << 1;//1100
printf("%d\n",b); //12
return 0;
}
位操作符:& | ^
//位操作符
//也是操作二进制位
// &
// int main()
// {
// int a = 3; //00000000000000000000000000000011
// int b = -5;//10000000000000000000000000000101 11111111111111111111111111111010 补码11111111111111111111111111111011
// int c = a & b;
// // & -- 对应二进制位,有0则为0,两个同时为1才是1
// //00000000000000000000000000000011
// //11111111111111111111111111111011
// //00000000000000000000000000000011 -补码
// printf("%d\n",c); //3
// return 0;
// }
//|
// int main()
// {
// int a = 3; //00000000000000000000000000000011
// int b = -5;//10000000000000000000000000000101 11111111111111111111111111111010 补码11111111111111111111111111111011
// int c = a | b;
// // | -- 对应二进制位,有1则为1,两个同时为0才是0
// //00000000000000000000000000000011
// //11111111111111111111111111111011
// //11111111111111111111111111111011 -补码
// //11111111111111111111111111111010
// //10000000000000000000000000000101 -5
// printf("%d\n",c); //-5
// return 0;
// }
//^
int main()
{
int a = 3; //00000000000000000000000000000011
int b = -5;//10000000000000000000000000000101 11111111111111111111111111111010 补码11111111111111111111111111111011
int c = a ^ b;
// ^ -- 对应二进制位,相同为0,相异为1
//00000000000000000000000000000011
//11111111111111111111111111111011
//11111111111111111111111111111000 -补码
//11111111111111111111111111110111
//10000000000000000000000000001000
printf("%d\n",c); //-8
return 0;
}
//不能创建临时变量,实现两个整数的交换
int main()
{
int a = 3;
int b = 5;
printf("交换前: a=%d b=%d\n",a,b);
// int tmp = a;
// a = b;
// b = tmp;
// a = a + b;
// b = a - b;
// a = a - b; 超过整形最大存储则不行
//a ^ a -> 0
//a ^ 0 = a
// 异或是支持交换律的
//a ^ b ^ a = 5
//a ^ a ^ b = 5
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);
return 0;
}
编写代码实现:求一个整数存储在内存中的二进制中1的个数
//编写代码实现:求一个整数存储在内存中的二进制中1的个数
//方法1
// int main()
// {
// //整数有32个bit位
// //获得32个bit位的每一位,
// //判断这一位是否为1
// //是1就是记数器+1
// int num = 10;
// int count = 0;
// while (num)
// {
// if (num%2 == 1)
// {
// count++;
// }
// num = num/2;
// }
// printf("二进制中1的个数 = %d\n",count);
// return 0;
// }
//方法2
int main()
{
int num = 10;
int i = 0;
int count = 0;
for(i=0;i<32;i++)
{
if (num & (1 << i))
{
count++;
}
}
printf("二进制中1的个数 = %d\n",count);
return 0;
}
赋值操作符: = += -= *= /= ....
单目操作符: ! sizeof + - ~ & *
关系操作符: > < >= <= == !=
逻辑操作符:&& ||
条件操作符:? :
逗号表达式 : ,
下标引用,函数调用和结构成员: []. (). . ->