操作符是什么
操作符分为,算术操作符,关系运算符,逻辑运算符,条件运算符,赋值运算符,单目运算符,逗号表达式。操作符作用是构建表达式。
操作符中所涉及的知识点
操作符的优先级和结合性
原码,反码,补码,按位与,按位或,按位异或,按位取反的求法
我们知道字符在内存中是以ASCII编码的形式存储,而数字在内存中是以二进制的补码的形式进行存储的,因此我们要知道二进制原码,反码和补码是如何进行计算的。
正数的原码,反码,补码是一致的。负数补码的求法:符号位不变其余按位取反,然后加1。
按位与(&):是对两个数的二进制形式进行操作,如果两个数的对应位都为1,那么结果就是1,否则就是0。
按位或(|):是对两个数的二进制形式进行操作,如果两个数的对应位有一个为1,那么结果就是1,否则就为0。
按位异或(^):是对两个数的二进制形式进行操作,如果两个数的对应位不同,那么结果就是1,否则就是0。
按位取反(~):按位取反操作是指对一个数的二进制形式进行操作,将0变为1,将1变为0。(补充一点当操作数为正数时原码反码补码一样,这时直接取反之后,此时的到是一个负数的补码并不能直接输出,需要求出原码)。
例:~1-->1110 1110-->1001 1001-->1010=-2
表达式求值
整形提升
C语⾔中整型算术运算总是⾄少以缺省整型类型的精度来进⾏的。为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整 型提升。表达式的整型运算要在CPU的相应运算器件内执⾏,CPU的通⽤寄存器的⻓度是int,所以小于int的整形值要转化为int或者unsigned int。
如何整形提升
1. 有符号整数提升是按照变量的数据类型的符号位来提升的
2. ⽆符号整数提升,⾼位补0
操作符中出乎意料的用处
1.不能创建临时变量(第三个变量),实现两个整数的交换
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0;
}
本题要求不适应第三个变量,因此这个方法较为难以想到,我们先通过a=a^b得到一个数,这个数与A异或得到一定是B,反之一定是A。
2. 编写代码实现:求⼀个整数存储在内存中的⼆进制中1的个数
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
for(i=0; i<32; i++)
{
if( num & (1 << i) )
count++;
}
printf("⼆进制中1的个数 = %d\n",count);
return 0;
}
int是四个字节,先进行整形提升:
如本题-1-->11111111 11111111 11111111 11111111
通过1<<i,每次的左移然后与num进行按位与(只有当两个操作数都为1是才为1,否则为0),此时的作用就是对num中出现1的个数进行记数。
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while(num)
{
count++;
num = num&(num-1);
}
printf("⼆进制中1的个数 = %d\n",count);
return 0;
}
n=n&(n-1)---->作用是把n二进制序列中最右边的1去掉。
比如3&(3-1)--->0011&0010--->0010,通过这个案例可以得到如下结论,这个结论是这样的,我们知道按位与必须两个都为1才为1,n-1--->这样相减一定保障了n与n-1 最右侧的位数是相反的那么进行运算后就会置为0,这样就可以通过计算执行次数进行计算二进制中为1的个数。
总结
操作符的种类较多,在程序中,优先级和结合性尤其要注意。操作符虽然在程序中不是很起眼,但是具有很多出乎意料的用法,因此我们要了解这其中的奥秘,并能较好的运用。最后欢迎大家在评论区进行指正。