C++ JOURNAL / 数据与计算
运算、数字拆分与进制
从四位数拆分,到按位重建一个数。
按我的学习记录整理 · 示例用于帮助理解这篇记录里
/ 和 % 分别做什么
+、-、* 分别用于加、减、乘。/ 是除法;两个整数相除得到整数,结果向零截断,例如 7 / 2 得到 3。% 是整数取余,7 % 2 得到 1。除数不能为 0。
对非负整数 n,n % 10 取出个位,n / 10 去掉个位。这里说“个位”的拆分方法以非负数为前提。
我做过的四位数拆分
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
if (n < 1000 || n > 9999) return 0;
int a, b, c, d;
d = n % 10;
n = n / 10;
c = n % 10;
n = n / 10;
b = n % 10;
n = n / 10;
a = n % 10;
cout << a << " " << b << " " << c << " " << d << endl;
return 0;
}
输入 1234,输出 1 2 3 4。a、b、c、d 分别是千、百、十、个位。n 在过程中不断改变;如果后面还需要原数,要先另存一份。|| 在这里表示“或者”,用于排除不属于四位正整数的输入。
二、八、十、十六进制
二进制使用 0、1;八进制使用 0 到 7;十进制使用 0 到 9;十六进制还使用 A 到 F 表示 10 到 15。
四位二进制 abcd 的十进制值是:
int value = a * 8 + b * 4 + c * 2 + d;
比如 1000 对应 8,不是把四个数字直接相加。这里每一位都应是 0 或 1。
x = x * k + a
从左到右读取 k 进制的各位时,每加入一位 a,先把已经读到的部分乘 k,再加 a。例如重建二进制 1011:
- 开始 x = 0。
- 读到 1:0 × 2 + 1 = 1。
- 读到 0:1 × 2 + 0 = 2。
- 读到 1:2 × 2 + 1 = 5。
- 读到 1:5 × 2 + 1 = 11。
a 必须是这个进制允许的数字;数值仍不能超出存储类型的范围。
0xF、hex 和 dec
源代码中的 0xF 表示十六进制的 F,也就是十进制 15。hex、dec 控制流里的整数进制:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n = 0xF;
cout << hex << n << " " << dec << n << endl;
return 0;
}
输出 f 15。变量没有变成另一种数,改变的是显示方式。进制设置会保留在对应的流中,后续需要十进制时要切回 dec。