操作符分类:
- 算术操作符 + - * /
- 移位操作符 >> <<
- 位操作符 & | ^
- 赋值操作符 = += -= <<= >>=
- 单目操作符 ! ~ & ++ --
- 关系操作符 > < == !=
- 逻辑操作符 && ||
- 条件操作符 exp1?exp2:exp3
- 逗号表达式 exp1,exp2,exp3
一、算术操作符
顾名思义就是跟数学中的算术一样,加减乘除等
int a = 10; int b = 20; int c = a + b; //相加 //c == 30 int d = a - b; //相减 //d == -10 int k = a * b; //相乘 //k == 200 int j = a / b; //相除 //j == 0 因为是int类型所以没有小数 int i = a % b; //取余 //i == 0
二、移位操作符
<< 左移 >>右移
int a = 1;
//00000000000000000000000000000001
int b = a << 1;
//左移就是将最后一位二进制位向左移一位
//00000000000000000000000000000010
printf("%d", b);
//打印输出结果为十进制 也就是2
右移运算分两种:
1. 逻辑移位
左边用0填充,右边丢弃
2. 算术移位
左边用原该值的符号位填充,右边丢弃
int a = 3;
//00000000000000000000000000000011
int b = a >> 1;
//左移就是将最后一位二进制位向右移一位
//00000000000000000000000000000001
printf("%d", b);
//打印输出结果为十进制 也就是1
这里需要注意:对于移位运算符,不能移动负数位
在计算机中数据的存储是二进制形式,负数的原码如果直接计算的话结果是错误的,因此一般计算都是用补码计算再转换为原码输出
正数的补码是其原码本身,负数的补码是原码取反后加1 也就是反码加1
三、位操作符
&(与):即两个二进制位有一个为0 则结果就为0,两个都为1 结果才为1
| (或):即两个二进制位有一个为1 则结果就为1,两个都为0 结果才为0
^ (异或):即两个二进制位相同为0,不同为1
例题:交换两个变量(不创建临时变量)
思路:如果使用加的方法,就会出现溢出的情况。异或就可以很好的解决该问题,一个常数异或0等于这个常数,一个常数异或自己本身等于0,按照这个逻辑就可推断出
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("交换前:a = %d b = %dn", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换后:a = %d b = %dn", a, b);
return 0;
}
四、赋值操作符
a+=b等价于 a=a+b,其他的赋值操作符同理
五、单目操作符
! 取反操作符 !1==0
~ 按位取反操作符,将二进制的每一位都取反
& 取地址操作符
++ 相当于加1 但有两个区别 a++(++后置时),先用后加。相反当++前置时,先加后用
-- 和++同理
六、关系操作符
a>b 则a大于b
a
a==b 则a等于b 需注意比较关系是要用两个等号
a!=b 则a不等于b
七、逻辑操作符
&& 逻辑与 exp1&&exp2 如果两个表达式都为真 则整体为真 一个或两个为假则整体为假
|| 逻辑或 与逻辑与刚好相反
八、条件操作符
exp1?exp2:exp3
如果表达式1为真 则输出表达式2,如果表达式1为假 则输出表达式3
九、逗号表达式
从左向右依次执行。整个表达式的结果是最后一个表达式的结果
例题:
1、求一个整数二进制中1的个数
int main()
{
int count = 0;
int n;
scanf("%d", &n);
for (int i = 0; i < 32; i++)
{
if ((n & 1) == 1)
count++;
n >>= 1;
}
printf("%d", count);
return 0;
}
2、两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
int main()
{
int a, b;
scanf("%d%d", &a, &b);
int c = a ^ b;
int count = 0;
for (int i = 0; i < 32; i++)
{
if ((c & 1) == 1)
count++;
c >>= 1;
}
printf("%d", count);
return 0;
}
3、打印整数二进制的奇数位和偶数位
int main()
{
int n;
scanf("%d", &n);
int a = sizeof(n) * 8; //计算出这个整数的bit一共多少位
printf("这个整数的所有偶数位为:");
for (int i = a - 1; i >= 1; i -= 2)
{
printf("%d", (n >> i) & 1); //将数字的每一位偶数位右移到第一位再与1(先将最高偶数位右移)
}
printf("n");
printf("这个整数的所有奇数位为:");
for (int i = a - 2; i >= 0; i -= 2)
{
printf("%d", (n >> i) & 1); //将数字的每一位奇数位右移到第一位再与1(先将最高奇数位右移)
}
return 0;
}



