CS BASICS · 底层根基 / 随查随用
计算机基础速查
进制换算、单位估算、字符编码、补码运算、字节序与位运算实战、编码格式选用、存储层级量级对比——计算机底层最常用的 83 个知识点一张表收齐,随查随用。
83条速查
12大主题
∞持续更新
📖 速查表
点击展开各小节
🔢 进制与转换
| 名称 | 说明 | 要点 / 示例 |
|---|---|---|
| 二进制 | 只有 0 和 1 两个数码,计算机内部一切数据的基本表示形式 | 前缀 0b 或 0B 0b1010 = 10 |
| 八进制 | 8 个数码(0~7),早期系统与文件权限常用 | Java 前缀 0,JS/Python 前缀 0o 0o17 = 15 权限 755 |
| 十六进制 | 16 个数码(0~9、A~F),一个进制位对应 4 个二进制位,常用于内存地址与颜色值 | 前缀 0x 或 0X 0xFF = 255 颜色 #FF5733 |
| 除基取余法 | 十进制转 N 进制:不断除以 N 记录余数,直到商为 0,余数倒序读出 | 13 转二进制:13÷2=6 余 1 → 6÷2=3 余 0 → 3÷2=1 余 1 → 1÷2=0 余 1 倒序读出 1101 |
| 按权展开法 | N 进制转十进制:各位数字乘以对应位权 N^i 后求和 | 0b1011 = 1×8 + 0×4 + 1×2 + 1×1 = 11 |
| 二 ↔ 十六进制 | 每 4 个二进制位对应 1 个十六进制位,直接分组即可,无需经过十进制 | 1111 0101 → 0xF5 补齐位数:左侧不足 4 位补 0 |
| 2 的幂速记 | 容量估算、掩码计算高频使用,建议记熟 | 2^10 = 1024 2^16 = 65536 2^32 ≈ 42.9 亿 必背 |
📏 数据单位换算
| 名称 | 说明 | 要点 / 示例 |
|---|---|---|
| bit(位) | 最小数据单位,只能表示 0 或 1 | 1 Byte = 8 bit 必背 |
| Byte(字节) | 8 个 bit 组成,是内存寻址与存储的基本单位 | ASCII 一个字符占 1 Byte;Java 的 byte 类型为 8 位有符号整数 |
| KB / MB / GB / TB | 相邻单位按 1024(2^10)倍换算,这是操作系统与编程中的标准口径 | 1 KB = 1024 B 1 MB = 1024 KB 1 GB = 1024 MB、1 TB = 1024 GB |
| 容量快速估算 | 结合 2 的幂估算内存、缓存需求 | 2^32 Byte = 4 GB int 数组 1 亿个元素 ≈ 4 亿 Byte ≈ 381 MB |
| 带宽 Mbps | 网络速率单位,小写 b 指 bit,每秒传输的比特数 | 100 Mbps = 100 Mbit/s 注意大小写 |
| Mbps vs MB/s | 1 Byte = 8 bit,下载速度(MB/s)= 带宽(Mbps)÷ 8 | 100 Mbps 宽带理论峰值 12.5 MB/s |
| 硬盘标称偏差 | 存储厂商按 1000 进位(1 GB = 10^9 Byte)标注容量,操作系统按 1024 进位显示 | 1 TB 硬盘在系统中显示约 931 GB,并非缩水 |
🔤 字符编码
排查乱码只问两个问题:写入时用了什么编码、读取时按什么编码解码,两者不一致就是乱码的唯一根源。
| 名称 | 说明 | 要点 / 示例 |
|---|---|---|
| ASCII | 128 个字符(0~127),占 1 字节且最高位为 0,包含英文、数字与控制符 | 'A' = 65 'a' = 97、'0' = 48 |
| GBK | 中文 Windows 历史默认编码,向下兼容 GB2312,收录简繁汉字 | 一个汉字占 2 字节 与 UTF-8 不同 |
| Unicode | 字符集而非编码方案,为全球每个字符分配唯一码点 | '中' = U+4E2D 具体字节排布由 UTF-8/UTF-16 等实现决定 |
| UTF-8 | 变长编码(1~4 字节),完全兼容 ASCII,是互联网与现代系统的事实标准 | 英文 1 字节、常用汉字 3 字节、emoji 4 字节 首选编码 |
| UTF-16 | 变长编码(2 或 4 字节),Java 的 char 即 UTF-16 码元,Windows 内部广泛使用 | 常用汉字占 2 字节;生僻字/emoji 用代理对占 4 字节 |
| 乱码根源 | 编码(写入)与解码(读取)使用的字符集不一致 | UTF-8 文件按 GBK 打开即乱码;解决方案是全链路统一 UTF-8 |
| BOM | 字节顺序标记,UTF-8 的 BOM 为 EF BB BF,可能干扰文件解析 | Java 读写文件显式指定 StandardCharsets.UTF_8,慎用带 BOM 的编辑器保存 |
🧮 原码 · 反码 · 补码
计算机实际用补码存整数,负数运算、强转溢出、位运算边界值(如 -1 全 1)都由此而来,是最容易算错的一节。
| 名称 | 说明 | 要点 / 示例 |
|---|---|---|
| 原码 | 最高位为符号位(0 正 1 负),其余位表示数值绝对值 | 8 位下 +5 = 0000 0101 -5 = 1000 0101 |
| 反码 | 正数的反码与原码相同;负数符号位不变,其余位按位取反 | -5 反码 = 1111 1010 |
| 补码 | 正数补码与原码相同;负数补码 = 反码 + 1,计算机实际存储使用的形式 | -5 补码 = 1111 1011 存储形式 |
| -1 的补码 | 8 位下 -1 的补码为全 1,是最容易识别的标志 | -1 = 1111 1111 = 0xFF |
| 为什么用补码 | 解决原码中 0 有两种表示(+0/-0)的问题,且减法可转化为加法,符号位直接参与运算无需特殊处理 | 5 + (-5) = 1 0000 0000,溢出位丢弃后恰好得 0 |
| 取值范围 | n 位补码可表示 -2^(n-1) ~ 2^(n-1)-1,负数比正数多一个 | 8 位:-128 ~ 127 32 位 int:约 ±21.47 亿 |
| 补码速算 | 「按位取反 +1」可双向使用:由负数求绝对值同样适用 | 1111 1011 → 取反 0000 0100 → +1 得 5 |
↔️ 字节序与位运算
| 名称 | 说明 | 要点 / 示例 |
|---|---|---|
| 大端 Big-Endian | 高位字节存放在低地址,符合人类书写习惯,网络传输采用 | 0x1234 存为 12 34 |
| 小端 Little-Endian | 低位字节存放在低地址,x86 / 常见 ARM 默认字节序 | 0x1234 存为 34 12 跨平台注意 |
| 网络字节序 | TCP/IP 统一规定网络字节序为大端,跨主机传输前需转换 | Java 的 ByteBuffer 默认 BIG_ENDIAN |
| 与 & | 两位都为 1 结果才为 1,常用于掩码取位、清零 | 0b1100 & 0b1010 = 0b1000 |
| 或 | | 有 1 则为 1,常用于置位、合并标志位 | 0b1100 | 0b0010 = 0b1110 |
| 非 ~ 与异或 ^ | ~ 按位取反;^ 相异为 1、相同为 0,可用于交换两数、简单加密、找单独的数 | 5 ^ 5 = 0、5 ^ 0 = 5 a^=b; b^=a; a^=b; 交换两数 |
| 位移 << >> >>> | << 左移补 0;>> 算术右移补符号位;>>> 逻辑右移恒补 0 | 1 << 10 = 1024 -8 >> 1 = -4、-8 >>> 1 = 2147483644 |
| 位运算技巧 | 高频技巧:判奇偶、清零最低位 1、判断 2 的幂 | n & 1 判奇偶 n & (n - 1) 清零最低位 1 n & (n - 1) == 0 判 2 的幂 面试高频 |
💾 存储层级
| 层级 | 说明 | 速度量级对比 |
|---|---|---|
| 寄存器 | CPU 内部,存放正在计算的指令与数据,容量最小、速度最快 | 约 < 1 ns 最快 |
| L1 / L2 / L3 缓存 | SRAM 介质;L1/L2 通常每核私有,L3 多核共享 | L1 约 1 ns、L2 约 4 ns、L3 约 10~20 ns |
| 内存(DRAM) | 进程运行的主要工作区,断电数据丢失,容量 GB 级 | 约 100 ns,比 L1 慢百倍 |
| SSD(固态硬盘) | 闪存介质、无机械部件,持久化存储首选 | 约 0.1 ms,比 HDD 快约百倍 |
| HDD(机械硬盘) | 磁盘寻道 + 旋转延迟决定速度,容量大、单位成本低 | 约 10 ms,比内存慢十万倍 |
| 局部性原理 | 时间局部性:刚访问的数据很快会再次访问;空间局部性:相邻数据会被接连访问 | 缓存预取的理论依据;顺序遍历数组远快于随机访问链表 性能优化根基 |
📐 浮点数表示
| 名称 | 说明 | 要点 / 示例 |
|---|---|---|
| IEEE 754 结构 | 浮点数由符号位、指数位、尾数位三段组成,本质是二进制版的科学计数法 | 32 位 = 1 符号 + 8 指数 + 23 尾数 64 位 = 1 符号 + 11 指数 + 52 尾数 |
| 单精度 float | 32 位(4 字节),约 6~7 位有效数字,适合图形等对精度不敏感的场景 | 指数偏移 127;Java 声明须加后缀 3.14f |
| 双精度 double | 64 位(8 字节),约 15~16 位有效数字,Java 默认的浮点类型 | 指数偏移 1023;字面量 3.14 默认即 double |
| 0.1 + 0.2 ≠ 0.3 | 0.1 等十进制小数在二进制下是无限循环,存储的是近似值,运算误差随之累积 | 0.1 + 0.2 = 0.30000000000000004 判等用 Math.abs(a - b) < 1e-9 面试高频 |
| 整数化规避 | 金额等精确计算先转为整数(分)参与运算,展示时再换算 | 1.23 元 → 123 分,加减乘全程精确 |
| BigDecimal 思想 | 用「无标度整数值 + 标度」表示十进制数,牺牲性能换取任意精度 | 用字符串构造 new BigDecimal("0.1") 除法须指定精度与舍入模式(如 HALF_UP) |
| 特殊值 | 指数全 1 表示无穷大或 NaN,指数全 0 表示非规格化数(渐进下溢) | 1.0 / 0.0 = Infinity 0.0 / 0.0 = NaN 注意 |
⚡ 逻辑门与布尔代数
| 名称 | 说明 | 要点 / 示例 |
|---|---|---|
| 与门 AND | 所有输入为 1 时输出才为 1,对应按位与 | 1 & 1 = 1、1 & 0 = 0 |
| 或门 OR | 任一输入为 1 输出即为 1,对应按位或 | 0 | 1 = 1、0 | 0 = 0 |
| 非门 NOT | 输出与输入相反,1 变 0、0 变 1,对应按位取反 | ~0 = -1(8 位下 1111 1111) |
| 异或 XOR | 输入相异输出 1、相同输出 0;自反且与 0 异或不变,可消重与交换 | 1 ^ 1 = 0、1 ^ 0 = 1 a ^ a = 0、a ^ 0 = a |
| 德摩根定律 | 「非(A 与 B)= 非A 或 非B」「非(A 或 B)= 非A 且 非B」,化简逻辑表达式必备 | !(A && B) = !A || !B !(A || B) = !A && !B 必背 |
| 半加器 | 不考虑低位进位的一位加法:异或得和位,与得进位位 | Sum = A ^ B、Carry = A & B |
| 全加器 | 含低位进位输入的一位加法,多个全加器级联即构成多位加法器 | Sum = A ^ B ^ Cin Cout = AB + Cin(A ^ B) |
💽 磁盘与 RAID
| 名称 | 说明 | 要点 / 示例 |
|---|---|---|
| HDD 机械盘 | 寻道 + 旋转延迟主导,随机读写性能弱,容量大、单位成本低 | 随机 IOPS 约 100~200,延迟约 5~10 ms |
| SSD 固态盘 | 闪存介质无机械部件,随机性能比 HDD 强百倍以上,存在写入寿命(TBW)限制 | SATA 盘 IOPS 数万、NVMe 盘数十万 延迟约 0.01~0.1 ms 系统盘首选 |
| RAID 0 条带 | 数据分片写到多盘并行读写,性能与容量最佳,但无任何冗余 | 容量 = n × 单盘;任意一盘损坏全盘数据丢失 高风险 |
| RAID 1 镜像 | 两两互为完整副本,冗余能力最直接,读性能可提升 | 容量利用率 50%;每组允许坏 1 块盘 |
| RAID 5 校验 | 奇偶校验信息分布存放在各盘,容量与安全的折中方案 | 至少 3 盘,允许坏 1 块;写入需计算校验有开销 |
| RAID 10 | 先镜像再条带(RAID 1 + 0),兼顾性能与冗余,重建快 | 至少 4 盘,每组允许坏 1 块 数据库/高 IO 场景常用 推荐 |
| 选型一句话 | 核心数据优先冗余,可再生的日志/缓存数据才考虑 RAID 0 | 数据库用 RAID 10;RAID 不等于备份,冷备 + 异地副本兜底 |
🧵 进程与线程初识
| 名称 | 说明 | 要点 / 示例 |
|---|---|---|
| 进程 | 资源分配的最小单位,拥有独立内存空间与系统资源 | 一个 JVM 就是一个进程;进程间通过 IPC(管道、socket、共享内存)通信 |
| 线程 | CPU 调度的最小单位,共享所属进程的堆与方法区 | 栈与程序计数器线程私有;共享数据需同步 并发安全 |
| 协程 | 用户态轻量「线程」,由程序自行调度,切换不经过内核 | 切换成本纳秒级、单线程可跑百万协程;Go goroutine、Kotlin 协程 |
| 并发 vs 并行 | 并发是交替执行(单核也可实现),并行是同时执行(依赖多核) | 高并发靠时间片轮转;并行度受 CPU 核数限制 |
| 上下文切换 | CPU 从一线程切到另一线程,需保存/恢复寄存器、缓存与内核状态 | 一次约 1~10 μs,频繁切换侵蚀吞吐 线程并非越多越快 |
| 一句话对比 | 进程隔离最稳、线程共享最省、协程切换最轻 | 要隔离选多进程;CPU 密集用线程池;IO 密集可上协程或 IO 多路复用 |
🔧 位运算实战
工程与面试里最高频的位运算套路:先记住两个坑——移位与按位运算符优先级低于加减,参与位运算的表达式要加括号;有符号数要考虑补码与边界值。
| 技巧 | 写法 | 实战说明 / 示例 |
|---|---|---|
| 奇偶判断 | x & 1 | 结果 1 为奇数、0 为偶数,比 x % 2 语义更直接;负数同样适用(补码末位即奇偶) 7 & 1 = 1、-6 & 1 = 0 最常用 |
| 乘除 2 的幂 | x << n / x >> n | 左移 n 位即 ×2^n,算术右移即 ÷2^n(向下取整) 易错:1 << n - 1 实际按 1 << (n - 1) 解析,优先级低于加减必须加括号 易错 |
| 异或交换 / 找唯一数 | a^=b; b^=a; a^=b; | 利用 a ^ a = 0、a ^ 0 = a 无临时变量交换;「只有一个数出现一次」的数组全员异或即得答案 坑:同一变量自交换会归零;读代码的人未必熟,可读性差时建议加注释 面试高频 |
| 取低 n 位 | x & ((1 << n) - 1) | (1 << n) - 1 即低 n 位全 1 的掩码,如取低 8 位 x & 0xFF(颜色/协议字段拆包常用) 坑:n 等于整型位宽时 1 << n 已越界,需特判或换无符号类型 |
| 大小写转换 | c ^ 32 / c | 32 / c & 0xDF | ASCII 字母第 5 位(值 32)区分大小写:异或翻转、或转小写、与转大写 坑:仅对字母有效,混入数字或符号会得到错误字符 易错 |
| 清零最低位的 1 | x & (x - 1) | 每次执行消去最低位的 1:0b1100 → 0b1000 → 0;位图压缩、状态压缩遍历子集、快速判集合为空都靠它 |
| 汉明重量(1 的个数) | while(x != 0) { x &= x - 1; count++; } | 循环几次就有几个 1,最坏循环次数只与 1 的个数有关而非位宽 工程直接用 Integer.bitCount(x),底层是 popcnt 硬件指令 实战技巧 |
| 判断 2 的幂 | x > 0 && (x & (x - 1)) == 0 | 2 的幂二进制只有一个 1,减一后与自身无公共位即成立 坑:漏掉 x > 0 时 x = 0 会误判为真;缓冲区取 2 的幂大小即可用此校验 面试高频 |
📦 编码格式选用对照
同一份数据选不同编码,体积与用途差别巨大:先分清「字符编码(UTF-8)」与「二进制转文本编码(Hex / Base64)」两层,排查乱码与体积问题才有方向。
| 编码 | 典型用途 | 体积代价 / 易错点 |
|---|---|---|
| Hex 十六进制 | 二进制数据的人类可读展示:内存 dump、抓包报文、文件魔数识别(如 EF BB BF) | 1 字节 → 2 字符,膨胀 ×2 体积最大 无歧义、可逐位核对,只适合展示与调试,不适合批量传输 |
| Base64 | 二进制转文本传输:邮件附件(MIME)、Data URL 内嵌图片、HTTP Basic 认证、JWT 载荷 | 3 字节 → 4 字符,膨胀约 ×4/3,末尾 = 填充 URL 场景用 Base64url(+/ 换 -_),否则会被转义破坏 传输首选 |
| URL 编码 | 转义 URL 保留字符与非 ASCII:查询参数、表单 application/x-www-form-urlencoded | 保留字符 ? & = # 必须编码,漏编即参数错乱 中文按 UTF-8 编码后每字符膨胀到 9 字符(3 字节 × %XX) 易错 |
| Unicode 转义 \uXXXX | 源码/配置/JSON 中安全书写非 ASCII:Java properties 的 native2ascii、JS 字符串常量 | BMP 内 1 字符 → 6 字符;超出 BMP 需代理对(\uD83D\uDE00) 只是表示形式,解码后仍是同一字符,不改变存储内容 |
| 选用口诀 | 展示用 Hex、传输用 Base64、拼 URL 用百分号编码、写死源码用 \u 转义 | 先定位数据所处层次:字节流选 Hex/Base64,字符流选 URL/Unicode 转义;链路上二者常叠加出现(先 UTF-8 再 Base64) |
| 安全红线 | 编码 ≠ 加密:Base64、Hex 无密钥、人人可逆 | JWT 载荷只是 Base64url,拿到 token 的人都能解码查看内容 机密数据必须先加密再编码 高频误用 |