> 技术文档 > #C语言——学习攻略:操作符的探索(一)

#C语言——学习攻略:操作符的探索(一)

🌟菜鸟主页:@晨非辰的主页

👀学习专栏:《C语言学习》

💪学习阶段:C语言方向初学者

名言欣赏:“计算机科学的核心是解决问题,而不是编程。”


前言:前面学习了函数递归相关知识,今天来认识、学习操作符,由于篇幅原因,将分为两篇进行分享。

目录

1. 操作符分类

2. 二进制和进制转换

2.1  2进制转10进制

2.1.1 10进制转2进制数字

2.2  2进制转8进制、16进制

2.2.1  2进制转8进制

 2.2.2  2进制转16进制

3. 原码、反码、补码

4. 移位操作符

4.1 左移

4.2 右移

​编辑

5. 位操作符:&、|、^、~

5.1 位操作符初步使用

5.2 位操作符相关练习

5.2.1  题1:不能创建临时变量(第三个变量),实现两个整数的交换

5.2.2  题2:编写代码实现——求一个整数存储在内存中的二进制中1的个数

5.2.3  题3:二进制位置0或者置1

6. 逗号表达式

7. 下标访问 [],函数调用 ()

7.1 下标访问

7.2 函数调用


1. 操作符分类

  • 算术操作符:+、-、*、/、%
  • 移位操作符:<>
  • 位操作符:&、|、^
  • 赋值操作符:=、+=、-=、*=、/=、%=、<>=、&=、|=、^=、
  • 单目操作符:!、++、--、&、*、+、-、~、sizeof(类型)
  • 关系操作符:>、>=、<、<=、==、!=
  • 逻辑操作符:&&、||
  • 条件操作符:exp1?exp2:exp3
  • 逗号表达式:,
  • 下标引用:[ ]
  • 函数调用:()
  • 结构成员访问:. 、->

 --上述操作符中,学过了算术、赋值、逻辑、条件以及部分单目操作符,今天继续学习,由于有些操作符会涉及二进制,先来铺垫一下二进制。


2. 二进制和进制转换

--2进制:

  • 逢2进1;
  • 2进制数字都是由0、1组成

2.1  2进制转10进制

--10进制数值: 123 的每一位都是有权重的,数值从右向左依次是个位、十位、百位……,每位权重是10⁰、10¹、10²……如下图——

--类比过去,2进制: 1101 每一位权重就是:2⁰、2¹、2²……

 --根据权重,就能很好理解了。

2.1.1 10进制转2进制数字

  

 --当然对于简单的10进制数值,可以直接选择权重相加,选上的为1,反之0,大家可以试一试!

2.2  2进制转8进制、16进制

2.2.1  2进制转8进制

--8进制数字由0~7组成,0~7数值转2进制,最多3个2进制位就够了;最大值7转2进制:111。

--转换规则:从2进制序列最右端向左每三个2进制位换一个8进制位,剩余不够三个的直接换:

        --如2进制01101011转8进制-01530开头数值被视为8进制

 2.2.2  2进制转16进制

--16进制数字由0~9、a~f(表示10进制10~15)组成,各自写成2进制,最多有4个二进制位就够了,比如f的2进制-1111;

--转换规则:从2进制序列最右端向左每4个2进制位换一个16进制位,剩余不够四个直接换。

        --如2进制:01101011,换成16进制:0x6b(表示16进制,前加0x


3. 原码、反码、补码

--整数的2进制表示:原、反、补(32位)。

--有符号整数三种表示方法均由符号位、数值位,2进制序中,最高位的1位被视作符号位,其余数值位。

        --符号位:\"0\"表示\"正\"、\"1\"表示\"负\"。

--正整数的原、反、补相同;负整数三种各不相同。

        --原:直接将数值按正负数形式翻译成2进制;

        --反:原码符号位不变,其余取反(0—>1\\1—>0)即可;

        --补:反码+1;(补码换原码:取反,+1)

--对于整型:数据存放在内存中放的是补码,为什么?

       --使用补码,可以将符号位、数值位统一处理;同时加减法也统一处理(CPU只有加法器,将减法变成加负数计算)。

        --最后打印输出转化为原码


4. 移位操作符

  • <<左移
  • >>右移

--操作数只能是整数

4.1 左移

--规则:左边抛弃,右边补0;

#include int main(){int num1 = 10;//左移一位int num2 = num1 <num1补码——>10//00000000000000000000000000010100——>num2补码——>20

4.2 右移

--规则:

  1. 逻辑右移:右边丢弃,左边补0;
  2. 算术右移:右边丢弃,左边有原符号值填充;

            --(逻辑右移/算术右移取决于编译器,VS2022中是算术右移。)

int main(){int num1 = 10;//右移一位int num2 = num1 >> 1;printf(\"%d\\n\", num1);printf(\"%d\\n\", num2);return 0;}//00000000000000000000000000001010——>num1补码——>10//00000000000000000000000000000101——>num2补码——>5

 --num = -1 

--注意:移位操作符,不能移动负数,未定义!


5. 位操作符:&、|、^、~

5.1 位操作符初步使用

--位操作符有:

  • &——按位与:对应位均为 1 时结果为 1,否则为 0。
  • | ——按位或:对应位至少有一个 1 时结果为 1,否则为 0。
  • ^——按位异或:对应位不同时结果为 1,相同时为 0。
  • ~——按位取反:所有位取反(包括符号位)

--操作数必须是整数

 --运行代码,直观了解一下:

int main(){int num1 = -3;int num2 = 5;printf(\"%d\\n\", num1 & num2);——>5//10000000000000000000000000000011——num1原//11111111111111111111111111111100——num1反//11111111111111111111111111111101——num1补// //00000000000000000000000000000101——num1&num2补——>5// //num2补:00000000000000000000000000000101printf(\"%d\\n\", num1 | num2);——>-3printf(\"%d\\n\", num1 ^ num2);——>-8printf(\"%d\\n\", ~0);——>-1return 0;}

5.2 位操作符相关练习

5.2.1  题1:不能创建临时变量(第三个变量),实现两个整数的交换

int main(){int num1 = 0;int num2 = 0;printf(\"请输入进行交换的数值:\");scanf(\"%d%d\", &num1, &num2);printf(\"num1 = %d num2 = %d\\n\", num1, num2);num1 = num1 ^ num2;//num1\'=num1^num2num2 = num1 ^ num2;//num2\'=num1\'^num2=num1^num2^num2=num1num1 = num1 ^ num2;//num1=num1^num2^num1//a^a=0;a^0=a;//支持交换律printf(\"num1 = %d num2 = %d\\n\", num1, num2);return 0;}

补充:   

        --a^a=0;a^0=a;
        --支持交换律;


5.2.2  题2:编写代码实现——求一个整数存储在内存中的二进制中1的个数

int count_bits1_of_n(int n){int count = 0;while (n){n = n & (n - 1);//循环进行一次就去掉一个1变成0,直到全为0,结束count++;}}int main(){int num = 0;printf(\"请输入:\");scanf(\"%d\", &num);int ret = count_bits1_of_n(num);printf(\"1的个数时:%d\", ret);return 0;}

--这串代码的构思比较难以想到,恰好运用了刚学的知识;一定要勤学、多练!


5.2.3  题3:二进制位置0或者置1

int main(){int a = 13;a = a | (1 << 4);printf(\"a=%d\\n\", a);a &= ~(1 << 4);printf(\"a=%d\\n\", a);return 0;}

 

6. 逗号表达式

--形式:

exp1, exp2, exp3, …expN

--逗号表达式:用\",\"将多个表达式隔开,从左向右依次执行,有实际意义的表达式进行计算,但只有最后表达式的结果位整个表达式的结果

int main(){int a = 1;int b = 2;int c = (a > b, a = b + 10, b = a + 1);//a=b+10有意义计算出a值,最后的表达式起作用,并延用a值printf(\"%d\\n\",c);return 0;}

7. 下标访问 [],函数调用 ()

7.1 下标访问

--这个操作符在前面数组部分涉及到;比如arr[ 9 ] = 10,操作符的操作数就是arr、9.

7.2 函数调用

--这个没啥可说的,直接看代码理解:

int Add(int x, int y){return x + y;}int main(){printf(\"hehe\\n\");int r = Add(3, 5);printf(\"%d\\n\",r);return 0;}

--操作数:函数名、参数都是操作数。


结语:本篇文章分享了关于操作符的一些知识,其中有旧知识也有新知识,一定要好好理解;下篇文章将会接着把操作符剩余部分知识进行分享。如果这篇文章对你的学习有帮助的话,欢迎一起讨论学习,你这么帅给个三连吧~~~