您的位置:首页 > 其它

lesson2 二进制运算

2016-08-27 06:36 225 查看

二进制之间的加法

例如:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: