美文网首页
(转)二进制相关基础

(转)二进制相关基础

作者: one_zheng | 来源:发表于2018-08-13 17:44 被阅读52次

    转载:https://mp.weixin.qq.com/s?__biz=MzU2NjIzNDk5NQ==&mid=2247483797&idx=1&sn=18579f6a4e319b6adefc02520a59e2bc&scene=21#wechat_redirect

    golang的基本数据类型-整型

    种类
     有符号(负号)
     1. int8 int16 int32 int64

    无符号(无符号)
     1. uint8 uint16 uint32 uint64

    架构特定(取决于系统位数)
     1. int uint

    类型别名
     1. Unicode字符rune类型等价int32
     2. byte等价uint8

    特殊类型
     1. uintptr,无符号整型,
     2. 由系统决定占用位大小,足够存放指针即可,和C库或者系统接口交互

    取值范围

    具体类型 取值范围 所占位数
    int8 -128到127 8
    uint8 0到255 8
    int16 -32768到32767 16
    uint16 0到65535 16
    int32 -2147483648到2147483647 32
    uint32 0到4294967295 32
    int64 -9223372036854775808到9223372036854775807 64
    uint64 0到18446744073709551615 64

    备注:1字节=8位(1 byte = 8bit)

    整数的表示

    • 原码:第一位为符号位(0表示正数,1表示负数)。

    • 反码:符号位不动,原码取反。

    • 负数补码:符号位不动,反码加1。

    • 正数补码:和原码相同。

    备注:补码的好处:
    * 使用补码可以没有任何歧义的表示0。
    * 补码可以很好的参与二进制的运算,补码相加符号位参与运算,这样就简单很多了。

    补码:

    在计算机系统中,数值一律用补码来表示(存储)。
    主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
    码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
    补码与原码的转换过程几乎是相同的。
    数值的补码表示也分两种情况:
    (1)正数的补码:与原码相同。
    例如,+9的补码是00001001。
    (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
    例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
    0000111按位取反为1111000;再加1,所以-7的补码是11111001。
    已知一个数的补码,求原码的操作分两种情况:
    (1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
    (2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
    例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为 “1”;其余7位1111001取反后为0000110;再加1,所以是10000111。

    浮点型

    主要为了表示小数
    也可细分float32和float64两种
    float64提供比float32更高的精度

    取值范围

    类型 最大值 最小非负数
    float32 3.402823466385288598117041834516925440e+38 1.401298464324817070923729583289916131280e-45
    float64 1.797693134862315708145274237317043567981e+308 4.940656458412465441765687928682213723651e-324

    IEEE745单精度浮点格式共32位,包含三个构成字段:23位小数f,8位偏置指数e,1位符号s。将这些字段连续存放在一个32位字里,并对其进行编码。其中0:22位包含23位的小数f; 23:30位包含8位指数e;第31位包含符号s。


    image.png

    一个实数V在IEEE 754标准中可以用V=(-1)s×M×2E 的形式表示,说明如下:

    • 符号s(sign)决定实数是正数(s=0)还是负数(s=1),对数值0的符号位特殊处理。
    • 有效数字M(significand)是二进制小数,M的取值范围在1≤M<2或0≤M<1。
    • 指数E(exponent)是2的幂,它的作用是对浮点数加权。
    符号位 指数位 小数位
    1位 8位 23位

    例如根据IEEE745,计算11000001000100000000000000000000的单精度浮点的值。

    解题:

    1 10000010 00100000000000000000000
    符号位 指数 尾数由于指数不是全部为0 所以小数位附加1
    1 10000010 1.00100000000000000000000
    -1 2^(130-127) (2^0 + 2^-3)

    结论:-1 * (2^0 + 2^-3) * 2^(130-127) =-9

    同样,你也可以验证一下十进制浮点数0.1的二进制形式是否正确,你会发现,0.1不能表示为有限个二进制位,因此在内存中的表示是舍入(rounding)以后的结果,即 0x3dcccccd, 十进制为0.100000001, 误差0.000000001由此产生了。

    进制的概念

    我们常用的进制有二进制、八进制、十进制和十六进制,十进制是最主要的表达形式。

    二进制是0和1;八进制是0-7;十进制是0-9;十六进制是0-9+A-F(大小写均可)。

    位运算符

    按位与(&)

    两位全为1,结果才为1:

    0&0=0;
    0&1=0;
    1&0=0;
    1&1=1;

    用法:

    • 清零:如果想要一个单位清零,那么使其全部二进制为0,只要与一个各位都为零的数值想与,结果为零。

    • 取一个数中指定位:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。

    例如:设X=1010 1110,取X的低4位,用X & 0000 1111 = 0000 1110 就可以得到。

    按位或(|)

    只要有一个为1,结果就为1:

    0|0=0;
    0|1=1;
    1|0=1;
    1|1=1;

    用法:常用来对一个数据的某些位置1;找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。

    例如:将X=1010 0000 的低四位置1,用X | 0000 1111 =1010 1111 就可以得到。

    异或运算(^)

    两个相应位为“异”(值不同),则该位结果为1,否则为0:

    0^0=0;
    0^1=1;
    1^0=1;
    1^1=0;

    用法:

    • 使特定位翻转:找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或就可以得到; 例如:X=1010 1110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001就可以得到

    • 与0相异或,保留原值 例如:X ^ 0000 0000 = 1010 1110

    • 两个变量交换值的方法: 1、借助第三个变量来实现: C=A; A=B; B=C; 2、 利用加减法实现两个变量的交换:A=A+B; B=A-B;A=A-B; 3、用位异或运算来实现:利用一个数异或本身等于0和异或运算符合交换律 例如:A = A ^ B; B = A ^ B; A = A ^ B;

    取反运算(~)

    对于一个二进制数按位取反,即将0变1,1变0: ~1=0; ~0=1;

    左移运算(<<)
    • 将一个运算对象的各二进制位全部左移若干位(左边的二进制丢弃,右边补零) 2<<1 = 4 : 10 <<1 =100=4

    • 若左移时舍弃的高位不包括1,则每左移一位,相当于该数乘以2。 -14(二进制:1111 0010)<< 2= (1100 1000) (高位包括1,不符合规则)

    右移运算(>>)(<<)

    将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。操作数每右移一位,相当于该数除以2.

    左补0 or 补1 得看被移数是正还是负。
    例:4 >> 2 = 1
    例:-14(1111 0010) >> 2 = -4 (1111 1100 )

    无符号右移运算(>>>)

    各个位向右移指定的位数。右移后左边突出的位用零来填充。移出右边的位被丢弃
    各个位向右移指定的位数。右移后左边突出的位用零来填充。移出右边的位被丢弃
    例如: -14>>>2
    即-14(1111 1111 1111 1111 1111 1111 1111 0010)>>> 2
    =(0011 1111 1111 1111 1111 1111 1111 1100)
    = 1073741820

    说明:

    • 0x80000000是数的十六进制表示,转成二进制表示为10000000000000000000000000000000
    • 运算的优先级,移位运算高于逻辑运算,>>>高于&
    • 位逻辑与运算 1&1 = 1 ,0&1 = 0
    • '>>>'无符号右移,移出部分舍弃,左边位补0;

    相关文章

      网友评论

          本文标题:(转)二进制相关基础

          本文链接:https://www.haomeiwen.com/subject/nkwfpftx.html