#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进制-0153(0开头数值被视为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 右移
--规则:
- 逻辑右移:右边丢弃,左边补0;
- 算术右移:右边丢弃,左边有原符号值填充;
--(逻辑右移/算术右移取决于编译器,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;}
--操作数:函数名、参数都是操作数。
结语:本篇文章分享了关于操作符的一些知识,其中有旧知识也有新知识,一定要好好理解;下篇文章将会接着把操作符剩余部分知识进行分享。如果这篇文章对你的学习有帮助的话,欢迎一起讨论学习,你这么帅给个三连吧~~~