lesson2 二进制运算


 二进制之间的加法

例如:

 1101 + 0011 = 10000     ----》  13 + 3 =16

二进制的加法很简单,只要记住逢2进1

二进制的减法

 例如:1101-0011  

计算机中进行运算不能退位补位(只有进位,所以程序异常有溢出,没有少了),只能转换为 1101 +(-0011)

所以 ,在计算机中如何表示负数?

计算机中只有一长串的引脚,每一个引脚是一个位,每一个引脚可以存储一个二进制的值。计算机通过一个个引脚来表示数值。我们规定一个固定的长度(8,16,32位)来表示一个数值,规定的长度之后,拿它最前面的一位来表示符号。0代表是正数,1代表负数。

比如 用 1 1000101 ,表示-69 ,但是这样运算存在问题    

        0011 (3)+1001(-1)=1100(-4) 结果错误 ,因此 -1用1001表示会存在运算问题,因此我们提出了补数。在运算减法的时候先计算出补数再进行相加。

        补数的计算:取反后再加1    ,因此-1表示为1111

二进制的乘除

    我们想在计算机中确定一个数,首先得确定它的长度(8,16,32,64),然后确定全存储(全是正数),还是要表示负数(当表示负数,最高位为1时,之后存储的数值是以补码的形式存储)。

        长度是硬性的,可以是任意位。但是需要一个合理的值,如果用2位表示负数,表示的数非常有限。长度决定了数的表示范围。

       左移: 左移一位 ,数值乘以2 

       右移:   0100  右移1位  0010  除以2 。

       如果是一个负数  1000 0000 (-128)右移两位, 如果右移补0 ,会得到00100000 ,因此,必须把首位跟着右移过去,补数右移前面补1 。 

      所以,在右移时,有逻辑右移和算术右移。

      逻辑右移 : 不管正数负数,右移时在前面补0。 

      算术右移:右移时,根据符号位来决定是补0还是补1

二进制的逻辑运算:

   与(and): 两者都为1(真) 时 为 1(真) 

   或(or):   两者都为0(假) 时 为 0(假)

   非(not): 1 ->0  ,  0->1

   异或:     不同为1

二进制数表示浮点数

 看如下代码

int main()
{
     float sum =0;
     for(int i =0;i<100;i++)
     {
         sum += 0.1;
     }
     printf("%f",sum);
     return 0;
}

运行结果为10.000002为什么会出现这种情况?

      二进制表示小数时 ,比如 0.9 用二进制表示   0.111......,会丢失一定的数据,计算机计算浮点数不可能准确的

     

如何处理这种情况   

     1. 不去处理,只要对程序不产生影响   忽略掉精度不对的情况, 

     2.不拿小数运算 (极端情况),乘以相应的倍数

      例如:(以前程序)

int main()
{
     float sum =0;
     for(int i =0;i<100;i++)
     {
         sum += 0.1 *10;
     }
     printf("%f",sum/10);
     return 0;
}

              

       

  

    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值