进制转换
二进制是计算机世界里的底座,也是计算机世界底层真正通用的数据格式,因为计算机中的值都是以 0 和 1 的电压形式存储的。
除二法
将十进制数转换为二进制表示形式的最简单方法是除二法,可用栈来跟踪二进制结果。除二法假定从大于 0 的整数开始,不断迭代地将十进制数除以 2 并跟踪余数。第一个除以 2 的余数表明了这个整数是偶数还是奇数。偶数的余数为 0,奇数的余数为 1。在迭代除以 2 的过程中将这些余数记录下来,就得到了一个二进制数字序列,第一个余数实际上是该序列中的最后一个数字。
rust
fn divide_by_two(mut dec_num: u32) -> String {
// 用栈保存余数 rem
let mut rem_stack = Stack::new();
// 余数 rem 入栈
while dec_num > 0 {
let rem = dec_num % 2;
rem_stack.push(rem);
dec_num /= 2;
}
// 栈中元素出栈,组成字符串
let mut bin_str = "".to_string();
while !rem_stack.is_empty() {
let rem = rem_stack.pop().unwrap().to_string();
bin_str += &rem;
}
bin_str
}
fn main() {
let num = 10;
let bin_str = divide_by_two(num);
println!("{num} = b{bin_str}");
}output:
shell
10 = b1010进制转换
rust
fn base_converter(mut dec_num: u32, base: u32) -> String {
// digits 对应各种余数的字符形式,尤其是 10 ~ 15
let digits = [
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
];
let mut rem_stack = Stack::new();
// 余数入栈
while dec_num > 0 {
let rem = dec_num % base;
rem_stack.push(rem);
dec_num /= base;
}
// 余数出栈并取对应字符以拼接成字符串
let mut base_str = "".to_string();
while !rem_stack.is_empty() {
let rem = rem_stack.pop().unwrap() as usize;
base_str += &digits[rem].to_string();
}
base_str
}
fn main() {
let num1 = 10;
let num2 = 43;
let bin_str = base_converter(num1, 2);
let hex_str = base_converter(num2, 16);
println!("{num1} = b{bin_str}, {num2} = x{hex_str}");
}output:
shell
10 = b1010, 43 = x2B