zoukankan      html  css  js  c++  java
  • 学习二进制

    什么是二进制

    计算机是由逻辑电路组成的, 计算机底层通信就是通过电信号传递的,逻辑电路通常只有两个状态接通和断开, 这两种状态证号可以用1,0表示。二进制数据就是用0和1两个数码来表示的数。

    这个我们经常可以在战争剧中看到, 他们在发送电报的时候,通过点击手柄,发送出去的就是电信号,不过他们使用了摩尔斯编码。

    进制转换

    我们常见的有二进制,十进制, 八进制,十六进制,这些进制之前是可以相互转换的。

    二进制与其他进制进行相互转换

    • 十进制转二进制 ==》 除2取余法

                

       (150)10 = (10010110)2

    • 二进制转八进制 ==》3位二进制一组

       (11001011)2 = (11 001 011)2 = (313)8 = (203)10

    • 二进制转八进制 ==》4位二进制一组

        (11001011)2 = (1100 1011)2 = (cb)16 = (203)10

    二进制的运算

    • 四则运算

       1. 加法

       

       2. 减法

       

    • 逻辑运算

       1. 按位与运算符(& 叫做and)

          规则:0&0 = 0, 0&1 = 0, 1&1=1.

          两位同时为1,结果为1,否则为0  
          (00000011) & (00000101) = (00000001)

       2.按位或运算符( | 或者叫做or)

          规则:0|0 = 0,1|0 = 1,0|1 = 1,1|1 = 1

          参加位运算的两位只要有一个为1,那么就为1
          (00000011) | (00000101) = (00000111)

       3.异或运算符(^ 也叫xor(⊕也表示异或))

          规则:0^0 = 0,0^1=1,1^0=1,1^1=0

          参加位运算的两位只要相同为0,不同为1
          (00000011)^(00000101 = (00000110)
          特别的任意数 ^ 0 = 任意数.

       4.取反运算符(~)

          规则:二进制位0变为1,1变为0

       5.左移(<<)

          规则:相当于乘以2

       6.右移(>>)

          规则:相当于除以2

    机器数

    数在计算机中的表示形式统称为机器数。

    最高位存放符号, 正数为0,负数为1

    机器数有2个特点:一是符号数字化,二是其数的大小受机器字长的限制

    • 真值

        第一位是符号位,所以机器数的形式值不等于真正的数值
        将带符号位的机器数对应的真正数值称为机器数的真值

        0000 0001的真值 = +000 0001 = +1
        1000 0001的真值 = -000 0001 = -1

    在计算机内,有符号数有3种表示法:原码、反码和补码

    • 原码

        原码是符号位加上真值的绝对值,即用第一位表示符号, 其余表示值. 例如8位二进制:
        [+1]原码 = 0000 0001
        [-1]原码 = 1000 0001
        八位二进制的取值范围:
        [1111 1111, 0111 1111] = [-127, 127]

        原码是有符号数的最简单的编码方式,便于输入输出,但作为代码加减运算时较为复杂

    • 反码

        反码的表示方法:
        正数的反码是其本身;
        负数的反码是在其原码的基础上, 符号位不变, 其余各个位取反;
        [+1] = [0000 0001]原码 = [0000 0001]反码
        [-1] = [1000 0001]原码 = [1111 1110]反码

    • 补码

        补码的表示方法:
        正数的补码就是其本身;
        负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后加1(即在反码基础上加1);
        [-1] = [1000 0001]原码 = [1111 1110]反码 = [1111 1111]补码
        在计算机系统中, 数值一律用补码来表示(存储)。数据在计算机中主要是以补码的形式存储的。

        使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理;此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

    计算机中采用二进制的主要原因

    • 技术实现简单:只有0,1两种状态;
    • 简化运算规则:0,1运算规则简单;
    • 适合逻辑运算:只有两个数码,正好和真假吻合;
    • 易于进行转换:二进制与十进制易于相互转换;
    • 抗干扰能力强,可靠性高等:只有两种状态,容易区分;

    二进制的一个应用场景

    • 判断以下两个IP地址是否在同一子网

        192.168.10.100/25

        192.168.10.200/25

        知识背景:

          IP地址分为两部分:网络部分和主机部分, 网络部分用于标识子网。

          子网掩码:表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。

          比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

          获取子网地址的方法:将IP地址与子网掩码进行AND(按位与)运算。

        192.168.10.100/25的IP地址二进制表示:

        192.168.10.100: 11000000 10101000 00001010 01100100

        192.168.10.100/25的子网掩码二进制表示(主要25表示前25位为网络位):

        子网掩码:11111111 11111111 11111111 10000000

        AND运算结果:

        

        

        192.168.10.200/25 AND运算结果:

        

        最后得出的网络地址不一样,所以这两个IP不在同一个子网。

  • 相关阅读:
    RedHat Linux-配置YUM仓库
    04、管道符、重定向与环境变量
    03、新手必须掌握的Linux命令
    size_t
    decltype关键字
    python numpy使用笔记
    Huffman编码
    动态规划(dynamic programming)
    Prim算法
    Kruskal算法
  • 原文地址:https://www.cnblogs.com/daly/p/11088863.html
Copyright © 2011-2022 走看看