整数运算:CPU内部只有加法运算

学汇编的一边儿去。我这里讲的是CPU进行计算的原理。
首先我这里用MC的红石电路模拟了一个加法器:http://www.0xaa55.com/thread-313-1-1.htm
首先加法器是怎么实现的呢?是用了非门电路。首先来看看二进制的加法:
0+0=0
0+1=1
1+0=1
1+1=10
首先来看规律。只看最低位,如果左边的“被加数”和“加数”都一样的话,结果的最低位是0,否则是1.
而如果“被加数”和“加数”都是1,那么就会有进位。
总结出来的规律是:
运算结果最低位=被加数 逻辑非 加数
运算结果的进位=被加数 逻辑与 加数
这个是加法器的原理。
那么回到主题,我说CPU内部只有加法运算。为什么这么说呢?来听我讲解:
CPU对于加法是用的加法运算。那么对于减法是怎么运算的呢?还是用的加法运算。
假设CPU是8位的CPU,那么,让我来举个例子。
01010101+11111111=101010100
得到的计算结果是个9位的二进制数。但是CPU是8位的,寄存器是8位,只能支持8位的二进制计算。多出来的这个位到哪里去了呢?不考虑
一种是CPU把一个数不断加上另一个数,比如3*6,CPU内部就进行3+3+3+3+3+3的运算。
另一种方法是改进了的方法,我举个例:
1010×100100
这个怎么看呢?
首先我们可以把它看成如下:
1000×100100+10×100100
这样就简单了,相当于100100左移3位再加上100100左移1位。
于是CPU内部就先把加数进行移位,然后将移位的加数累加起来。就得到了运算结果了。实质上来说,CPU也只是进行的加法运算。
那么除法运算呢,我这里举个例:10010010÷00101101的商是11,余数是1011。是怎么得来的呢?
其实也和我们小学做竖式的计算一样。
             11
       ________
101101/10010010
        101101
       --------
        1110000
         101101
        -------
           1011
就是这样一位一位除下来。

https://www.0xaa55.com/forum.php?mod=viewthread&tid=318&extra=page%3D14

时间: 2024-10-13 21:18:58

整数运算:CPU内部只有加法运算的相关文章

[leetcode] Sum of Two Integers--用位运算实现加法运算

问题: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example: Given a = 1 and b = 2, return 3. 分析: 这里要求我们不能用加法.减法等运算符来实现加法运算.这里应该使用位运算来实现加法运算,实际上,这也是计算机CPU内部实现加法运算的方案. x XOR y真值表: x y output 0 0 0 0 1 1

浮点转定点算法-加法运算

这里默认用的是32位的float存储,其具体规则可以看个连接http://bbs.chinaunix.net/thread-3746530-1-1.html 将浮点数用32位的定点形式表示. 将两个数通过移位扩大至相同的倍数. 定点加法运算. 将上一步的运算结果还原为浮点表示. #define MIN(X,Y) (X>=Y?Y:X) /** 浮点的加法运算转换为定点的加法运算 * author : zgr 2014-04-03 * 1. 内存中符号位+阶码+尾数的浮点表示法转换为符号位+整数部分

如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算

package interview_10_10; import org.junit.Test; public class T1 { /** * 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算). */ @Test public void test1() { String number1 = "4324328732789"; String number2 = "2383244324324325898

基于Java的大整数运算的实现(加法,减法,乘法)学习笔记

大整数,顾名思义就是特别大的整数. 一台64位的机器最大能表示的数字是2的64次方减一: 18446744073709551615 java语言中所能表示的整数(int)最小为-2147483648 public class test { public static void main(String[] args) { System.out.println(Integer.MIN_VALUE); } } 最大为 2147483647 public class test { public stat

[PAT] 一元多项式的乘法与加法运算 C语言实现

[PAT] 02-线性结构1 一元多项式的乘法与加法运算 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格.零多项式应输出0 0. 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出

五:大数运算-加法运算

问题 : 大数-加法运算题目描述请计算两个整数相加(数的范围:0 <= num < 10 ^ 100)输入两个整数输出一个整数样例输入10000001000000样例输出2000000 1 #include<stdio.h> 2 #include<string.h> 3 #define M 100000 4 int Inter_Sum[M]; 5 void fun(char str1[],char str2[]){ 6 int t,m=0,i=strlen(str1);

02-线性结构2 一元多项式的乘法与加法运算 (20 分)

02-线性结构2 一元多项式的乘法与加法运算 (20 分) 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格.零多项式应输出0 0. 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输

7-22 一元多项式的乘法与加法运算 (20 分)

7-22 一元多项式的乘法与加法运算 (20 分) 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格.零多项式应输出0 0. 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出样例:

图解算法:单向链表做加法运算

问:给出两个非空的链表,来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且每个结点只能存储一位数字.将这两个链表相加起来,返回一个新的链表,表示他们之和. 例如:342 + 465 = 807 两数相加这道题,处理的就是最简单的数学加法运算,只是它是建立在链表的基础之上,所以难度在于对链表的处理. 加法运算,除了每一位的加法之外,还需要考虑进位的情况.针对这道题来说,链表的每一个结点存储一位数字,并且是基于自然数字逆序存储,也就是链头到链尾保持低到高位的顺序,这样就等于,进位