前面讲到布思算法的计算机底层模拟的时候,我们是借助于一个可以储存.表示任意N位的二进制补码的BinaryQueue实现的,现在我们模拟计算机底层整数除法还是要借助于它: BinaryQueue类代码:https://www.cnblogs.com/XT-xutao/p/10050518.html 我又写了一个只基于二进制字符串的,更简单,更方便 现在考虑计算机底层除法是怎样实现的. 对于我们人工计算来说是比较简单的,从高位一直到低位,一次次除,得出每一位的商,最后剩下余数即可. 计算机似乎也可以…
ALU是计算机CPU的核心,即 算术逻辑单元(arithmetic and logic unit)ALU有几大功能,是计算机计算最基础的功能:1.算术运算:包含加法.减法等2.逻辑运算:主要是布尔运算,逻辑和.或.非.异或等3.求补器:计算机中,二进制补码极其重要,可以求一个二进制的补码(源码取反得反码,反码加一得补码)4.移位器:主要有 算术右移.逻辑右移.左移5.状态标志:一个记录状态的标志. /** */ public class ALU { /** * 返回一个整数的定长二进制字符串(补…
引子 在我之前的一篇文章[ ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#) ]里曾经提到过编译器在处理除数为常数的除法时,是有优化的,今天整理出来,一来可以了解是怎么实现的,二来如果你哪天要写编译器,这个理论可以用得上.此外,也算我的一个笔记. 实例 我们先来看一看编译器优化的实例.我们所说的除数为常数的整数除法(针对无符号整型, 有符号整型我们后面再讨论),指的是,对于unsigned int a, b, c,例如:a / 10, b /…
#include "limits.h" #include "math.h" int abs(int number) { int const mask = number >> (sizeof(int) * CHAR_BIT - 1); return (number + mask) ^ mask; }   这是一个求绝对值的函数,看了它不禁想起负数在计算机中的构成.   负数在计算机中是按补码存储的,如何给定一个int型数,输出它的补码呢?以及给一个数的补码…
题目描述 Given two postive integers A and B,  please calculate the maximum integer C that C*B≤A, and the real number D equal to A/B. 输入格式 Two integers A and B in one line separated by a space.(A,B>0) 输出格式 Output C in one line,followed by D in one line. D…
int  通常为16位  存储单元 float  通常为32位 取决于具体的机器 #include main() { int fathr,celsius; int lower,upper,step; lower = 0; upper =300; step= 20; fathr = lower; while(fathr<=upper) { /* 整数除法将执行舍位,结果中的任何小数部分都会被舍弃 */ celsius = 5*(fathr-32)/9; /* printf函数并不是C语言的本身的一…
剑指 Offer II 001. 整数除法 解题思路 在计算的时候将负数转化为正数,对于32位整数而言,最小的正数是-2^31, 将其转化为正数是2^31,导致溢出.因此将正数转化为负数不会导致溢出. 设置一个变量,用来记录正数个数,以便在最后的结果调整正负号. 特殊情况,可能溢出的情况讨论,由于是整数除法,除数不为0,商的值一定小于等于被除数的绝对值,因此,int型溢出只有一种情况,(-2^31)/(-1) = 2^31. 最容易想到的是通过减法代替除法,但是会超时 class Solutio…
c++ 超大整数除法 高精度除法 解题思路 计算a/b,其中a为大整数,b为普通整数,商为c,余数为r. 根据手算除法的规则,上一步的余数记为r,则本次计算的被除数为t=r*10+被除数的本位数值a[i],商t/b,本步余数为t%b 除法是从最高位开始计算的,所以需要反转reverse一下,才能保持和前面加减乘一样的数据存储 打卡代码 #include<bits/stdc++.h> using namespace std; vector<int> div(vector<int…
二进制补码:Why & How 学习计算机原理或者语言的底层操作难免会遇到用二进制补码表示负数的问题.由于一些书本上对于采用补码的原因没有详细解释,很多人会认为这只是一种规定,但实际上采用补码是因为这种表示方法拥有实际的优势.而对于求补码的方法“按位取反再加一”,给出解释的资料就更少,本文试图给出二进制补码的优势和求法的简单解释. Why 首先回答为什么要使用补码的问题.补码是一种计算机中负数的表示方法,当然,计算机中可以表示负数的方法不止补码一种,但目前几乎只有补码这种方法得到了广泛运用.数字…
回顾:  1.数据类型  2.二进制(八进制,十六进制) --------------------------------------------------------- 计算机中不可以使用负号表示负数 计算负数二进制的过程:  1.计算出相反数的二进制  2.把上一步的结果按位求反再加一 使用上述方法计算出的结果就是二进制补码,可以直接存储在计算机中 所有数据类型中,左边一个 1 右边全 0 的二进制表示这个类型中的最小数 -55 -->  55  --> 32 + 16 + 4 + 2…