二进制的魅力

数字和二进制

古时候,人们常常结绳计数。在计算的世界中,数字就像是绳上的结,对于计算至关重要。
对于计算机存储的所有信息类型,最终都是以数字 0 和 1 的形式存储的。二进制计数就是 0、1 表示的计数方法。

记数系统

先来了解几个概念

  • 基数 : 记数系统的基本数值,规定了这个系统中使用的数字量和数位位置的值。
  • 数位:数字从右至左的排位,也称为位权

比如 123 = 1 * 100 + 2 * 10 + 3
基数就是 101 的数位是 22 的数位是 13 的数位是 0
所有 123 也可以表示成:
123 = 1 * 102 + 2 * 101+ 3 * 100

所有在基数为 R 的计数系统中,数值 X = a1 * R(n-1) + a2 * R(n-2)+ … + an * R0,X 为十进制数。

不同进制之间的转换

  • 十进制数转换成其它进制的数
    我们通常使用短除法来对进制之间进行转换,看看下面的一个例子

十进制数 123 表示成二进制数
a1 = 123 / 2 = b1(61) + c1(1)
a2 = b1 / 2 = b2(30) + c2(1)
a3 = b2 / 2 = b3(15) + c3(0)
a4 = b3 / 2 = b4(7) + c4(1)
a5 = b4 / 2 = b5(3) + c5(1)
a6 = b5 / 2 = b6(1) + c6(1)
a7 = b6 / 2 = b7(0) + c7(1)
那么 123 = c7…c1 = 1111011

二进制转十进制代码示例(C++):

#include <iostream>
#include <vector>

using namespace std;

void int2bin(const int& n) {
    if (n <= 0) {
        std::cout << "-1";
    } else {
        int tmp = n;
        int mod = 0;
        std::vector<int> vec;
        while (tmp > 0) {
            mod = tmp % 2;
            tmp = tmp / 2;
            vec.insert(vec.begin(), mod);           
        }
        for (auto x : vec) {
            std::cout << x;
        }
    }
    std::cout << std::endl;
}

/**
 * 输入一个正整数,转换为二进制表示的字符串
 * */
int main() {
    int n;
    while (std::cin >> n) {
        int2bin(n);
    }
    return 0;
}
  • 八进制数转换成二进制数
    由于 2 和 8 都是 2 的幂值,两者很容易转换,
    如二进制数 111000 = 八进制数 70,八进制数 707 = 二进制数 111000111
    只需要按每3位对应转换即可。

思考:二进制和十六进制怎么方便的转换?

混合进制数的理解

混合进制数就是数值的每一个数字的基数可能都不同,如下可表示:
X = a1 * R1n-1 + a2 * R2n-2 + … + an * Rn0

比如 123, 1 是以 10 为基数的数,2 是以 8 为基数的数,3 是以 16 为基数的数,那么
123 = 1 * 102 + 2 * 81 + 3 * 160

讨论:混合进制数有哪些方面的应用呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值