
各位刚踏入大学的小伙伴们,是不是对C语言又好奇又有点小紧张?其实C语言里的操作符就像我们玩游戏时的技能按钮,只要搞懂怎么用,就能轻松操控程序啦!今天咱们就用最接地气的方式,从二进制开始,一步步学会用操作符“打怪升级”。
咱们平时数数都是1、2、3、4……这是十进制,满10就进一位。但计算机这小家伙比较“笨”,只看得懂0和1,这就是二进制。就像游戏里的开关,按一下亮(1),再按一下灭(0),用一堆开关就能表示各种数字啦。
进制 | 数字15的写法 | 特点 | 游戏里的例子 |
|---|---|---|---|
十进制 | 15 | 0-9十个数字,满10进1 | 血量显示15点 |
二进制 | 1111 | 只有0和1,满2进1 | 四个灯全亮表示15 |
八进制 | 017 | 0-7八个数字,前面加0 | 游戏里的隐藏关卡编号017 |
十六进制 | 0xF | 0-9加a-f(a=10),前面加0x | 装备颜色代码0xF(红色) |
咱们写代码时,八进制必须加0开头,十六进制加0x开头,不然计算机分不清哦。比如写017,计算机就知道是八进制的15;写0xF,就知道是十六进制的15。
十进制转二进制:除2取余法 就像分苹果,把125个苹果每次分成2堆,记录剩下的1个,最后把剩下的按倒序排起来。
125 ÷ 2 = 62 余 1
62 ÷ 2 = 31 余 0
31 ÷ 2 = 15 余 1
15 ÷ 2 = 7 余 1
7 ÷ 2 = 3 余 1
3 ÷ 2 = 1 余 1
1 ÷ 2 = 0 余 1 把余数倒过来:1111101,这就是125的二进制啦。
二进制转十进制:拆快递法 二进制1101就像四个快递盒,从右到左编号0、1、2、3,每个盒子里的数乘以2的编号次方,再加起来:
1×2³(8) + 1×2²(4) + 0×2¹(0) + 1×2⁰(1)= 13
计算机存数字用补码,就像游戏里的“正负buff”:
比如-10: 原码:10001010(最高位1表示负数) 反码:11110101(符号位不变,其他位0变1、1变0) 补码:11110110(反码+1)
为啥这么麻烦?因为用补码的话,计算机算减法就像算加法一样简单,比如10-5=10+(-5),硬件设计会更简单哦。
移位操作符就像游戏里的“左右平移”技能,让数字在二进制里搬家。有左移(<<)和右移(>>)两种,操作起来超简单。
规则:左边的位扔掉,右边补0 效果:左移n位,数字变成原来的2ⁿ倍(就像游戏里的攻击翻倍)
代码示例:
#include <stdio.h>
int main() {
int score = 10; // 二进制:00001010(像10分的装备)
int double_score = score << 1; // 左移1位,相当于×2
int quad_score = score << 2; // 左移2位,相当于×4
printf("原分数:%d\n", score); // 输出10
printf("左移1位后:%d\n", double_score); // 输出20
printf("左移2位后:%d\n", quad_score); // 输出40
return 0;
}运行结果就像装备升级,10分的装备左移1位变成20分,左移2位变成40分,超直观!
规则:右边的位扔掉,左边补符号位(正数补0,负数补1) 效果:右移n位,数字变成原来的1/2ⁿ(整数除法,就像血量减半)
代码示例:
#include <stdio.h>
int main() {
int hp = 20; // 二进制:00010100(20点血)
int half_hp = hp >> 1; // 右移1位,相当于÷2
int quarter_hp = hp >> 2; // 右移2位,相当于÷4
printf("原血量:%d\n", hp); // 输出20
printf("右移1位后:%d\n", half_hp); // 输出10
printf("右移2位后:%d\n", quarter_hp); // 输出5
return 0;
}注意哦:不要移负数位(比如hp << -1),这就像游戏里的“无效操作”,计算机也不知道该干啥~
位操作符能直接操作二进制的每一位,就像玩拼图时移动单个碎片。常用的有4种:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)。
规则:两位都是1,结果才是1,否则0(像游戏里的“双buff生效”)
比如3(0011)和5(0101)按位与:
0011
& 0101
------
0001(结果1)代码示例:判断奇偶数(二进制最后一位是1就是奇数)
#include <stdio.h>
int main() {
int num = 7;
// 如果num&1等于1,就是奇数;等于0就是偶数
if (num & 1) {
printf("%d是奇数\n", num); // 7是奇数
} else {
printf("%d是偶数\n", num);
}
return 0;
}规则:两位有一个是1,结果就是1(像游戏里的“单buff生效”)
比如3(0011)和5(0101)按位或:
0011
| 0101
------
0111(结果7)代码示例:给数字的某一位设为1
#include <stdio.h>
int main() {
int flag = 0; // 二进制0000,像未激活的技能
flag = flag | 8; // 8是1000,按位或后变成1000(激活第4位)
printf("激活后:%d\n", flag); // 输出8
return 0;
}规则:两位不同为1,相同为0(像游戏里的“不同阵营攻击”)
比如3(0011)和5(0101)按位异或:
0011
^ 0101
------
0110(结果6)超实用技巧:不借临时变量交换两个数
#include <stdio.h>
int main() {
int a = 3, b = 5;
printf("交换前:a=%d, b=%d\n", a, b); // 3和5
a = a ^ b; // a变成3^5=6
b = a ^ b; // b变成6^5=3(原来的a)
a = a ^ b; // a变成6^3=5(原来的b)
printf("交换后:a=%d, b=%d\n", a, b); // 5和3
return 0;
}规则:把所有位翻转(像游戏里的“反转阵营”)
比如~0(二进制全0)会变成全1,在32位系统里就是-1(因为补码全1表示-1)。
代码示例:
#include <stdio.h>
int main() {
int light = 1; // 二进制0001(一盏灯亮)
int dark = ~light; // 按位取反,变成1110...
printf("取反前:%d\n", light); // 输出1
printf("取反后:%d\n", dark); // 输出-2(补码特性)
return 0;
}咱们来做个简单的游戏权限管理,用4位二进制表示4种权限:
代码示例:
#include <stdio.h>
// 定义权限常量
#define CHAT 1 // 0001
#define TRADE 2 // 0010
#define TEAM 4 // 0100
#define ADMIN 8 // 1000
// 检查是否有某个权限
int hasPermission(int user, int perm) {
return user & perm; // 按位与,有就返回非0
}
int main() {
int player = CHAT | TEAM; // 有聊天和组队权限(0101)
// 检查权限
if (hasPermission(player, CHAT)) {
printf("可以聊天\n");
}
if (hasPermission(player, TRADE)) {
printf("可以交易\n"); // 不会执行,因为没有这个权限
}
if (hasPermission(player, TEAM)) {
printf("可以组队\n");
}
// 新增交易权限
player = player | TRADE;
if (hasPermission(player, TRADE)) {
printf("现在可以交易了\n");
}
return 0;
}运行结果:
可以聊天
可以组队
现在可以交易了是不是超简单?就像给游戏角色添加技能buff一样,用位操作符轻松管理权限~
今天咱们学了二进制和4种位操作符、2种移位操作符,记住这些关键点:
其实C语言操作符一点都不难,就像游戏里的技能,多练几次就熟练啦。下次写代码时,试试用位操作符代替乘法除法,不仅酷还能让程序跑得更快哦!如果有不懂的地方,欢迎在评论区留言,咱们一起讨论~