首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >写给大一新生的C语言入门指南 —— 操作符

写给大一新生的C语言入门指南 —— 操作符

作者头像
CodeSuc
发布于 2025-11-03 18:21:30
发布于 2025-11-03 18:21:30
3860
举报

前言

各位刚踏入大学的小伙伴们,是不是对C语言又好奇又有点小紧张?其实C语言里的操作符就像我们玩游戏时的技能按钮,只要搞懂怎么用,就能轻松操控程序啦!今天咱们就用最接地气的方式,从二进制开始,一步步学会用操作符“打怪升级”。

一、二进制:计算机的“摩斯密码”

咱们平时数数都是1、2、3、4……这是十进制,满10就进一位。但计算机这小家伙比较“笨”,只看得懂0和1,这就是二进制。就像游戏里的开关,按一下亮(1),再按一下灭(0),用一堆开关就能表示各种数字啦。

1. 不同进制怎么写?看这张表就够了

进制

数字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. 二进制和十进制怎么转换?教你两招

十进制转二进制:除2取余法 就像分苹果,把125个苹果每次分成2堆,记录剩下的1个,最后把剩下的按倒序排起来。

代码语言:javascript
复制
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

3. 计算机怎么存负数?用补码当“翻译”

计算机存数字用补码,就像游戏里的“正负buff”:

  • 正数:直接存二进制(原码=反码=补码)
  • 负数:先取反(反码),再加1(补码)

比如-10: 原码:10001010(最高位1表示负数) 反码:11110101(符号位不变,其他位0变1、1变0) 补码:11110110(反码+1)

为啥这么麻烦?因为用补码的话,计算机算减法就像算加法一样简单,比如10-5=10+(-5),硬件设计会更简单哦。

二、移位操作符:数字的“左右移动”

移位操作符就像游戏里的“左右平移”技能,让数字在二进制里搬家。有左移(<<)和右移(>>)两种,操作起来超简单。

1. 左移操作符(<<):数字“放大”术

规则:左边的位扔掉,右边补0 效果:左移n位,数字变成原来的2ⁿ倍(就像游戏里的攻击翻倍)

代码示例:

代码语言:javascript
复制
#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分,超直观!

2. 右移操作符(>>):数字“缩小”术

规则:右边的位扔掉,左边补符号位(正数补0,负数补1) 效果:右移n位,数字变成原来的1/2ⁿ(整数除法,就像血量减半)

代码示例:

代码语言:javascript
复制
#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,结果才是1,否则0(像游戏里的“双buff生效”)

比如3(0011)和5(0101)按位与:

代码语言:javascript
复制
  0011
& 0101
------
  0001(结果1)

代码示例:判断奇偶数(二进制最后一位是1就是奇数)

代码语言:javascript
复制
#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;
}
2. 按位或(|):“有一个就保留”

规则:两位有一个是1,结果就是1(像游戏里的“单buff生效”)

比如3(0011)和5(0101)按位或:

代码语言:javascript
复制
  0011
| 0101
------
  0111(结果7)

代码示例:给数字的某一位设为1

代码语言:javascript
复制
#include <stdio.h>
int main() {
    int flag = 0;  // 二进制0000,像未激活的技能
    flag = flag | 8;  // 8是1000,按位或后变成1000(激活第4位)
    printf("激活后:%d\n", flag);  // 输出8
    return 0;
}
3. 按位异或(^):“不一样才保留”

规则:两位不同为1,相同为0(像游戏里的“不同阵营攻击”)

比如3(0011)和5(0101)按位异或:

代码语言:javascript
复制
  0011
^ 0101
------
  0110(结果6)

超实用技巧:不借临时变量交换两个数

代码语言:javascript
复制
#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;
}
4. 按位取反(~):“0变1,1变0”

规则:把所有位翻转(像游戏里的“反转阵营”)

比如~0(二进制全0)会变成全1,在32位系统里就是-1(因为补码全1表示-1)。

代码示例:

代码语言:javascript
复制
#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种权限:

  • 第0位:聊天权限(1表示有)
  • 第1位:交易权限(2表示有)
  • 第2位:组队权限(4表示有)
  • 第3位:管理员权限(8表示有)

代码示例:

代码语言:javascript
复制
#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;
}

运行结果:

代码语言:javascript
复制
可以聊天
可以组队
现在可以交易了

是不是超简单?就像给游戏角色添加技能buff一样,用位操作符轻松管理权限~

总结:操作符其实很好玩

今天咱们学了二进制和4种位操作符、2种移位操作符,记住这些关键点:

  • 二进制是计算机的“母语”,0和1就像开关
  • 左移×2、右移÷2,就像数字的“缩放术”
  • 位操作符能操控单个二进制位,像玩拼图一样灵活

其实C语言操作符一点都不难,就像游戏里的技能,多练几次就熟练啦。下次写代码时,试试用位操作符代替乘法除法,不仅酷还能让程序跑得更快哦!如果有不懂的地方,欢迎在评论区留言,咱们一起讨论~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 前言
    • 一、二进制:计算机的“摩斯密码”
      • 1. 不同进制怎么写?看这张表就够了
      • 2. 二进制和十进制怎么转换?教你两招
      • 3. 计算机怎么存负数?用补码当“翻译”
    • 二、移位操作符:数字的“左右移动”
      • 1. 左移操作符(<<):数字“放大”术
      • 2. 右移操作符(>>):数字“缩小”术
    • 三、位操作符:二进制的“拼图游戏”
      • 1. 按位与(&):“两个都有才保留”
      • 2. 按位或(|):“有一个就保留”
      • 3. 按位异或(^):“不一样才保留”
      • 4. 按位取反(~):“0变1,1变0”
    • 四、实战小项目:用位操作做个“权限管理系统”
    • 总结:操作符其实很好玩
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档