C语言中操作符的讲解(重点部分)

操作符是什么

操作符分为,算术操作符,关系运算符,逻辑运算符,条件运算符,赋值运算符,单目运算符,逗号表达式。操作符作用是构建表达式。

操作符中所涉及的知识点

操作符的优先级和结合性

来自官网优先级和结合性

原码,反码,补码,按位与,按位或,按位异或,按位取反的求法

我们知道字符在内存中是以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的个数。

总结

操作符的种类较多,在程序中,优先级和结合性尤其要注意。操作符虽然在程序中不是很起眼,但是具有很多出乎意料的用法,因此我们要了解这其中的奥秘,并能较好的运用。最后欢迎大家在评论区进行指正。

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值