【计算机组成原理】定点乘法运算之补码一位乘法(Booth算法)

x * y = z
讨论已知x和y的情况下,怎么通过补码一位乘法方法得出z~~
首先说下运算规则~

  1. 和原码一位乘法不同的是,补码一位乘法的符号位是参加运算的~运算的所有的数包括得到的结果z都是补码的形式~
  2. 被乘数x取双符号参与运算,部分积的初值为0~~乘数y取单符号位~
  3. 乘数y末尾首先要增加一个附加位0,每次讨论的是y的最后两位~但是每次移动是移动一位哦~
  4. 判断y的最后两位的时候,遵循这样的规则:
  • 为00或者为11的时候,直接右移一位
  • 为01的时候,加x的补,然后右移一位
  • 为10的时候,加-x的补,然后右移一位

    5. 不过有个特例,就是最后一步不用右移一位!

举个栗子~~

比如x = -0.1101,y=0.1011

先写出x的补码:[x]补 = 11.0011,再写出-x的补码:[-x]补 = 00.1101

一开始部分积的初值是:00.0000

在y后面加个0~那么y变成了0.10110

然后从y的最后两位开始往前,0.10110当前最后两位是10,所以加上[-x]补:

00.0000 + 00.1101 = 00.1101

右移一位,变成00.01101

此时y =0.10110的最后两位变成了11(是往前挪了一个位置哦,不是两个~),按照规则应该直接右移一位就好啦,就变成了00.001101

此时y =0.10110的最后两位变成了01,所以根据规则要加[x]补:

00.001101 + 11.0011 = 11.011001

右移一位,变成了11.1011001

此时y =0.10110的最后两位变成了10,加上[-x]补:

11.1011001 + 00.1101 = 00.1000001

右移一位,变成了:00.01000001

此时y =0.10110最后两位是01(所以从这里就可以知道规则里面要在y前面补一个0的作用了吧嘿嘿),加[x]补:

00.01000001 + 11.0011 = 11.01110001

因为这已经是最后一步了,所以不用再右移了,所以最后结果就是1.01110001

这个结果是x*y的补码哦~

【计算机组成原理】定点乘法运算之原码一位乘法

x * y = z
讨论已知x和y的情况下,怎么通过原码一位乘法方法得出z~~
首先说下运算规则~
1. z的符号位通过x和y的符号位进行异或运算得到~(这个很好理解哒,负负得正,正正得正,正负得负嘛~所以把符号位异或得到的结果就是乘法运算后应该的结果咯~)
2. 所以就不用讨论x和y的符号位啦,z除了符号之外的其他部分由x的绝对值乘以y的绝对值得到~
1、2两点总结一下就是说:被乘数和乘数均取绝对值参加运算,符号位单独考虑~

我们手工进行乘法运算的时候,是通过y从右往左每一位都和x相乘,(乘完一次就往前缩进一个数位)然后把结果相加得到的~机器也是这样运算哒~不过机器为了节约空间,毕竟按照手算的方法那样两个n位相乘最后可能会需要2n的长度空间才能得到结果,计算机是采用把每次用y的一位和x相乘的结果(叫做部分积)累加后右移一位,再处理y当前位的下一位的~

3. 我们把被乘数x先取双符号,而且让部分积初始值为0,并且长度和被乘数x相同(就是添0让长度相同的意思啦~)

计算机只有0和1,所以处理乘法的时候运算法则远没有99乘法表那么复杂,运算规则为:

4. 从y的最后一位开始(一直到第一位)分别与x相乘:

  • 当y的当前位为1,则部分积加上x的绝对值
  • 当y的当前位为0,则部分积加上0

5. 右移一位,在前面加0。不断处理y的每一位,知道y的所有位都处理过为止~~

可能有点晕,举个栗子~

比如x = 0.1101  ,y = 0.1011

  1. 先把部分积设为初始值0(长度扩展到和x相同),即
    00.0000
  2. y的最后一位是1,所以要加上x的绝对值:
    00.0000 + 00.1101 = 00.1101
  3. 右移1位,前面补0,变成了00.01101 
  4. 好啦,下面处理y的倒数第二位,还是1,继续加x的绝对值:
    00.01101 + 00.1101 = 01.00111
  5. 别忘记右移1位,前面补0,这样就变成了00.100111 
  6. y倒数第3位是0,只要加0就好了(加0的结果还是本身啊。),所以还是:00.100111
  7. 既然加了0,别忘记右移一位哦,所以变成了00.0100111 
  8. y还剩最后一个位(也就是第一位)没处理啦,第一位是1哦,那就加上x的绝对值:
    00.0100111 + 00.1101 = 01.0001111
  9. 别忘记右移一位!所以最后结果是 00.10001111~~~

嗯好啦,这就是最后结果~~不过双符号位就变成一个0就好咯,也就是最后结果为0.10001111~~~

【软件项目管理】任务(活动)之间的排序依据主要有:强制性依赖关系、软逻辑关系、外部依赖关系

任务(活动)之间的排序依据主要有:强制性依赖关系、软逻辑关系、外部依赖关系。

项目各项任务(活动)之间存在相互联系与相互依赖关系,根据这些关系安排各项活动的先后顺序。确定任务(活动)之间关联关系的依据主要有以下几种:

1.强制性依赖关系

强制性依赖关系是工作任务中固有的依赖关系,是一种不可违背的逻辑关系,又被称为硬逻辑关系或内在的相关性,它是由客观规律和物质条件的限制造成的。例如,需求分析一定要在软件设计之前完成,测试活动,一定要在编码任务之后执行。

2.软逻辑关系

软逻辑是由项目管理人员确定的项目活动之间的关系,是人为的、主观的,是一种根据主观意志去调整和确定的项目活动关系,也可以称指定性相关,或者偏好相关或软相关。例如,安排计划的时候,哪个模块先做,哪个模块后做,哪个任务先做好一些,哪些任务同时做好一些,都可以由项目经理确定。

3.外部依赖关系

外部依赖是项目活动与非项目活动之间的依赖关系,例如,环境测试依赖于外部提供的环境设备等。

【Spring】使用数据源连接池访问数据库

Spring并没有提供数据源连接池实现,但是可以选择其他开源的实现:

这些连接池中得大多数都能配置为Spring的数据源,在一定程度上与Spring自带的DriverManagerDataSource或SingleConnectionDataSource很类似。如下是配置DBCP BasicDataSource的方式:

也可以用Java来配置:

上面两种方式配置的四个属性是BasicDataSource所必需的。属性driverClassName指定了JDBC驱动类的全限定类名。在这里我配置的时MySql数据库的数据源  。属性url用于设置数据库的JDBC URL。最后,username和password用于在连接数据库时进行认证。

【Spring】Spring的AOP术语解释

通知(Advice)

切面的工作被称为通知,通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。它应该应用在某个方法被调用之前?之后?之前和之后都调用?还是只是在方法抛出异常时调用?

Spring切面可以应用5种类型的通知:

+ 前置通知(Before):在目标方法被调用之前调用通知功能;

+ 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;

+ 返回通知(After-returning):在目标方法成功执行之后调用通知;

+ 异常通知(After-throwing):在目标方法抛出异常后调用通知;

+ 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

连接点(Join point)

连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。

切点(Pointcut)

切点有助于缩小切面所通知的连接点的范围。切点的定义会匹配通知所要植入的一个或多个连接点。

切面(Aspect)

切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和何处完成其功能