操作符详解(下篇)
前言
操作符详解(上篇)
条件操作符
条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下:
代码语言:javascript复制 exp1 ? exp2 : exp3
如果表达式1为真,那么就计算表达式2,表达式2的结果为整个式子的 结果; 如果表达式1为假,那么就计算表达式3,表达式3的结果为整个式子的结果。
例如求两个数的最大值
代码语言:javascript复制#include<stdio.h>
int main()
{
int a = 0, b = 0, c = 0;
printf("请输入两个数:n");
scanf("%d %d", &a, &b);
c = a > b ? a : b;
printf("较大的数为:%dn", c);
return 0;
}
移位操作符
这涉及到数据在内存中的存储形式
不了解的小伙伴可以先去看这篇: 【C语言篇】数据在内存中的存储(超详细)
<<
左移操作符
>>
右移操作符
移位操作符的操作数只能是整数
左移操作符
移位规则:左边抛弃、右边补0
代码语言:javascript复制#include <stdio.h>
int main()
{
int num = 10;
int n = num<<1;
printf("n= %dn", n);
printf("num= %dn", num);
return 0;
}
右移操作符
移位规则:⾸先右移运算分两种:
- 逻辑右移:左边⽤0填充,右边丢弃
- 算术右移:左边⽤原该值的符号位填充,右边丢弃
#include <stdio.h>
int main()
{
int num = 10;
int n = num>>1;
printf("n= %dn", n);
printf("num= %dn", num);
return 0;
}
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
警告⚠⚠:对于移位运算符,不要移动负数位,这个是标准未定义的。
一般更多采用算术右移
位操作符
位操作符有:
代码语言:javascript复制& //按位与
| //按位或
^ //按位异或
~ //按位取反
注:他们的操作数必须是整数。
- 按位与&
- 对应的二进制位,有0则为0,两个同时为1,才为1
- 例子如下:
/int main()
//{
// int a = 6;
// //00000000000000000000000000000110 - 6的补码
// //
// int b = -7;
// //10000000000000000000000000000111
// //11111111111111111111111111111000
// //11111111111111111111111111111001 -> -7的补码
//
//
// int c = a & b;//a和b的补码的二进制位进行运算
// //对应的二进制位,有0则为0,两个同时为1,才为1
// //
// //00000000000000000000000000000110 - 6的补码
// //11111111111111111111111111111001 -> -7的补码
// //00000000000000000000000000000000
// printf("%dn", c);
//
// return 0;
//}
- 按位或|
- 对应的二进制位,有1则为1,两个同时为0,才为0
- 按位异或^
- 对应的二进制位,相异为1,相同为0
- 按位取反~
- 对应二进制位,1变为0,0变为1
代码语言:javascript复制不能创建临时变量(第三个变量),实现两个整数的交换。
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a b;
b = a - b;
a = a - b;
printf("a = %d b = %dn", a, b);
return 0;
}
这种方法在数据较大时会发生溢出
- 使用异或操作
- 0和任何数异或都是任何数本身
- 异或满足交换律和结合律
- 任何数异或自己都是0
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b
printf("a = %d b = %dn", a, b);
return 0;
}
求一个整数在内存中存储二进制1的个数
- 方法一:十进制转二进制每次除二,余1则count
- 注意传过来的参数要转为unsigned int,否则负数统计会出现错误
int count_bit_one(unsigned int n)
{
int count = 0;
while (n)
{
if ((n % 2) == 1)
count ;
n = n / 2;
}
return count;
}
- 方法二:
- 使用移位操作符
- 这里必须循环32次,还可以优化
#include <stdio.h>
int count_bit_one(int n)
{
int i = 0;
int count = 0;
for (i = 0; i < 32; i )
{
if (((n >> i) & 1) == 1)
{
count ;
}
}
return count;
}
- 方法三:
- 使用&运算符
- 很巧妙,很难想到