CC++ & Algorithm

二进制与计算机

中等72
语言版本:C++Python
概述:计算机只认识0和1,就像开关的“开”和“关”,我们通过二进制来让计算机理解世界。

计算机的“开关语言”:二进制揭秘

你有没有想过,为什么手机、电脑、平板这些智能设备能听懂你的指令?为什么它们能显示五彩缤纷的画面、播放动听的音乐?秘密就在于——计算机只认识两个数字:01。这就像开关的“开”和“关”,灯泡的“亮”和“灭”,简单到极致,却可以组合出无穷的信息。今天我们就来揭开二进制与计算机的神秘面纱,看看这个“开关城堡”是如何运作的。

为什么计算机只用0和1?

计算机内部其实是一个巨大的“开关城堡”。每个开关只有两个状态:打开或者关闭。我们把这“打开”叫做1,“关闭”叫做0。所有计算机做的事情,无论是玩游戏、看视频,还是写作业,都是靠无数个这样的开关组合完成的。

为什么不直接使用我们熟悉的0~9十个数字呢?因为电子元件最容易实现两种状态:有电(高电压)代表1,没电(低电压)代表0。如果要用10种电压,那电路会变得极其复杂,容易出错。想象一下,如果你家里的电灯开关有10个档位,你每次开灯都要精确调到“第三档”才能亮,那该多麻烦!所以,计算机干脆只用“开”和“关”两个状态,简单又可靠。

生活中的类比

  • 你教室里的电灯:开关只有上(开)和下(关)两个位置。
  • 你手机上的通知灯:亮或者灭。
  • 乒乓球比赛记分:一个灯亮表示分数是1,不亮表示0。成千上万个灯同时亮灭,就能记下整场比赛的分数。

二进制怎么表示数字?

我们平时用的是十进制,有0到9十个数字,满十进一。二进制只有0和1两个数字,满二进一。就像我们只有两个手指头,数到2就要“进位”一样。看看下面这个表,左边是十进制数,右边是对应的二进制数。

十进制二进制解释(想象你只有两根手指)
000根手指伸出
111根手指伸出
210满2了,在左边新开一个位置,写上1,右边归0。就像伸出2根手,但新位置代表“2个一捆”。
311左边位置有1个“2”,右边位置有1个“1”。
4100满两个“2”了,再向左进位。左边新位置代表“4个一捆”。
51014 + 1 = 5
61104 + 2 = 6
71114 + 2 + 1 = 7
81000满两个“4”了,再进位……

你会发现,二进制数里只有0和1,没有2、3、4这些符号。每一个位置(称为“位”)代表不同的“权重”,从右往左依次是:1、2、4、8、16……(2的0次方、2的1次方、2的2次方……)。这和十进制从右往左是:1、10、100、1000……是一个道理。

快手计算法:想快速把十进制转成二进制?可以用“除以2取余法”。例如把5转成二进制:

5 ÷ 2 = 2 余 1  → 最低位(最右边)是1
2 ÷ 2 = 1 余 0  → 第二位是0
1 ÷ 2 = 0 余 1  → 第三位是1
从下往上读余数:101。所以5的二进制是101(前面的0可以省略)。

计算机里的二进制

计算机里的“开关”其实是用电信号来控制的。有电是1,没电是0。成千上万的开关组合在一起,就可以表示任何信息。比如,英文字母A在计算机里被表示为01000001(8个开关的状态)。这是通过一套规则(ASCII编码)约定好的:每个字符对应一个0~255的数字(二进制8位),计算机看到01000001就知道它代表字母A。

不只是数字和字母

  • 图片:每个像素的颜色,比如红色(R)、绿色(G)、蓝色(B)各用8位二进制表示(0~255),三种颜色组合出1600多万种颜色。
  • 声音:声音的波形每隔一小段被采样,每个采样值用二进制数字记录。
  • 电影:其实就是连续播放一张张图片,每张图片都由二进制描述。

可以说,你手机里的一切——自拍、聊天记录、游戏存档——最终都化为一长串0和1,保存在存储芯片里。

新手最容易犯的错误

  1. 混淆二进制和十进制:有人看到二进制“10”就念成“十”,其实它等于十进制里的2。记住:二进制里没有数字2,只有0和1。
  2. 位数不够用:二进制数可以很长。比如十进制255,二进制是11111111(8个1)。初学者有时会漏写前面的0,比如5只写101而不是00000101。不过计算机内部会固定位数(如8位、16位、32位),前面补0不影响值。
  3. 加法进位搞错:二进制加法是“满二进一”。1+1=10(向前进1,本位写0)。比如二进制101(5)+ 011(3)= 1000(8),不要算成1010。
  4. 误以为计算机里直接存储十进制:计算机的CPU只懂二进制,任何数字、文字、颜色都要先转成二进制才能处理。

用C++感受二进制(完整示例)

下面的C++代码能帮你直观地看一个数字在计算机里怎么用二进制存储。我们使用bitset这个工具,它可以把整数直接转换成二进制形式显示出来。代码中,我们用循环输出多个数字,让你感受“满二进一”的规律。

#include <iostream>
#include <bitset>
using namespace std;

int main() {
    // 首先演示几个简单的数字
    cout << "数字的二进制表示(固定8位)" << endl;
    
    int a = 0;   // 十进制0
    cout << a << "  -> " << bitset<8>(a) << endl;  // bitset<8>表示用8位二进制显示
    
    int b = 1;   // 十进制1
    cout << b << "  -> " << bitset<8>(b) << endl;
    
    int c = 2;   // 十进制2
    cout << c << "  -> " << bitset<8>(c) << endl;
    
    int d = 3;   // 十进制3
    cout << d << "  -> " << bitset<8>(d) << endl;
    
    int e = 5;   // 十进制5
    cout << e << "  -> " << bitset<8>(e) << endl;
    
    int f = 10;  // 十进制10
    cout << f << " -> " << bitset<8>(f) << endl;
    
    int g = 255; // 十进制255(最大8位)
    cout << g << " -> " << bitset<8>(g) << endl;
    
    cout << "\n现在来点生活的例子:" << endl;
    
    // 假设你考试得了95分,下面看看95的二进制
    int score = 95;  // 考试分数
    cout << "考试分数 " << score << " 分的二进制:";
    cout << bitset<8>(score) << endl;
    
    // 你的零花钱有50元
    int money = 50;  // 零花钱
    cout << "零花钱 " << money << " 元的二进制:";
    cout << bitset<8>(money) << endl;
    
    // 用循环输出0到15的二进制,看看进位规律
    cout << "\n0到15的二进制(4位显示)" << endl;
    for (int i = 0; i <= 15; i++) {
        cout << i << " -> " << bitset<4>(i) << endl;
    }
    
    return 0;
}

运行结果(部分):

数字的二进制表示(固定8位)
0  -> 00000000
1  -> 00000001
2  -> 00000010
3  -> 00000011
5  -> 00000101
10 -> 00001010
255 -> 11111111

现在来点生活的例子:
考试分数 95 分的二进制:01011111
零花钱 50 元的二进制:00110010

0到15的二进制(4位显示)
0 -> 0000
1 -> 0001
2 -> 0010
3 -> 0011
4 -> 0100
5 -> 0101
6 -> 0110
7 -> 0111
8 -> 1000
9 -> 1001
10 -> 1010
11 -> 1011
12 -> 1100
13 -> 1101
14 -> 1110
15 -> 1111

看到没?5在计算机里是00000101,10是00001010,它们都只用0和1组成。而且从0到15的输出中,你可以清楚地看到“满二进一”的现象:当右边一位从1变成0时,左边一位就加1。

更进一步:相关知识点指引

学会了二进制,你可以继续探索这些有趣的领域:

  • 位运算:直接对二进制位进行操作(与、或、异或、左移、右移)。在位运算中,可以高效地判断奇偶、交换数值、设置标志位等。
  • 数据编码:除了数字,字符(如字母A)用ASCII码、汉字用UTF-8或GBK编码,图片用RGB编码,这些背后都是二进制。
  • 计算机存储单位:1位(bit)就是1个二进制开关,8位组成1字节(byte),1024字节是1KB,1024KB是1MB……你的手机64GB,就是约640亿个字节,也就是5120亿个开关!
  • 进制转换:学会二进制后,你会发现八进制、十六进制(计算机常用)都是二进制的“缩略版”。比如十六进制用09和AF表示4位二进制,程序员常用它来缩短长串二进制数。

好了,现在你知道了二进制是怎样的一种“开关语言”,下次再看到计算机里“只有0和1”的说法,就不会觉得奇怪了。试着用上面的代码,把你自己考试分数、生日、喜欢的数字转成二进制看看,感受一下计算机世界的基础语言吧!

例题精讲

1单选题

计算机内部采用二进制表示数据,最根本的原因是?

A二进制运算规则简单
B二进制在物理上容易实现,如电子元件的通/断状态
C二进制书写方便,人类容易理解
D二进制可以表示更多信息
2单选题

二进制数(1101)₂转换为十进制数是多少?

A11
B12
C13
D14
3判断题

计算机中存储的文本、图像、声音等所有数据,最终都是以二进制形式(0和1)表示的。

4填空题
以下程序将整数n(n>0)从最低位到最高位逐位输出其二进制表示的每一位。请补全循环中的代码。

#include <iostream>
using namespace std;
int main() {
    int n = 13;
    while (n > 0) {
        cout << ___;
        n >>= 1;
    }
    return 0;
}
5单选题

在二进制数中,从最右边(最低位)开始,第4位的位权是(假设最低位为第1位)?

A2
B4
C8
D16