《操作符》
文章目录
1.算数操作符
2.移位操作符
右移操作符:有÷2效果
算术右移:右边丢弃,左边补原符号位(正0负1)
逻辑右移:右边丢弃,左边补0
左移操作符:有x2效果
左边丢弃,右边补0
【注】关于原码、反码、补码
3.位操作符
注释
&按位与:两个同时是1才是1
|按位或:只要一个是1就是1
^按位异或:相同为0,相异为1
练习
不创建临时变量,实现两个数的交换
#include<stdio.h>
int main()
{
创建临时变量
//int a = 3;
//int b = 5;
//int tmp = 0;
//printf("before:a=%d b=%d\n", a, b);
//tmp = a;
//a = b;
//b = tmp;
//printf("after:a=%d b=%d\n",a, b);
加减法:可能会溢出(不创建临时变量)
//int a = 3;
//int b = 5;
//printf("before:a=%d b=%d\n", a, b);
//a = a + b;
//b = a - b;
//a = a - b;
//printf("after:a=%d b=%d\n", a, b);
//亦或的方法
int a = 3;
int b = 5;
printf("before:a=%d b=%d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("after:a=%d b=%d\n", a, b);
return 0;
}
求一个整数储存在内存中的二进制中1的个数
此方法只能计算正数:
#include<stdio.h>
int main()
{
int num = 0;
int count = 0;
scanf("%d", &num);
//统计num的补码中有几个1
while (num)
{
if (num % 2 == 1)
{
count++;
}
num = num / 2;
}
printf("%d\n", count);
return 0;
}
正确方法:
#include<stdio.h>
int main()
{
int num = 0;
int count = 0;
scanf("%d", &num);
int i = 0;
for (i = 0; i < 32; i++)
{
if (1 == ((num >> i) & 1))
{
count++;
}
}
//32bit
//num&1==1(同时是1才是1)
//00000000000000000000000000000011
//00000000000000000000000000000001
//00000000000000000000000000000001
printf("%d", count);
return 0;
}
4.赋值操作符
=
复合操作符
eg:
a=a+2;
a+=2;
a=a>>1;
a>>=1;
5.单目操作符
&和*:
sizeof:
~:
++、–
前置++:先++,后使用
后置++:先使用,后++
6.关系操作符
7.逻辑操作符
【注】1,……真0假
区分按位与和逻辑与,按位或和逻辑或:
8.条件(三目)操作符
表达式1的结果如果为真,表达式2要算,其结果为整个表达式的结果;
表达式1的结果如果为假,表达式3要算,其结果为整个表达式的结果。
9.逗号操作符
10.下标引用,函数调用和结构成员
下标引用操作符[]
操作数:一个数组名+一个索引值
函数调用操作符()
接受一个或者多个操作数,第一个操作数是函数名,剩余的操作数就是传递给函数的参数
访问一个结构的成员
结构体.成员名
结构体指针->成员名
11.表达式求值
隐式类型转换
整形提升
如何整形提升
用符号位上的数字补齐
eg:
实例
算术转换
操作符的属性
练习
获取一个整数二进制序列中所有的偶数位和奇数位
#include<stdio.h>
void print(int m)
{
int i = 0;
printf("奇数位:\n");
for (i = 30; i >= 0; i -= 2)
{
printf("%d", (m >> i) & 1);
}
printf("\n");
printf("偶数位:\n");
for (i = 31; i >= 1; i -= 2)
{
printf("%d", (m >> i) & 1);
}
printf("\n");
}
int main()
{
int m = 0;
scanf("%d", &m);
print(m);
return 0;
}