被除数

转 位运算实现加减乘除运算

不问归期 提交于 2020-03-04 19:08:58
我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平。无论多么复杂的逻辑、庞大的数据、酷炫的界面,最终体现在计算机最底层都只是对0101的存储和运算。因此,了解位运算有助于提升我们对计算机底层操作原理的理解。 今天就来看看怎么不使用显式“ + - * /”运算符来实现加减乘除运算。 下面我们一个一个来看。 1. 加法运算 先来个我们最熟悉的十进制的加法运算: 13 + 9 = 22 我们像这样来拆分这个运算过程: 不考虑进位,分别对各位数进行相加,结果为sum: 个位数3加上9为2;十位数1加上0为1; 最终结果为12; 只考虑进位,结果为carry: 3 + 9 有进位,进位的值为10; 如果步骤2所得进位结果carry不为0,对步骤1所得sum,步骤2所得carry重复步骤1、 2、3;如果carry为0则结束,最终结果为步骤1所得sum: 这里即是对sum = 12 和carry = 10重复以上三个步骤,(a) 不考虑进位,分别对各位数进行相加:sum = 22; (b) 只考虑进位: 上一步没有进位,所以carry = 0; (c) 步骤2carry = 0,结束,结果为sum = 22. 我们发现这三板斧行得通! 那我们现在还使用上面的三板斧把十进制运算放在二进制中看看是不是也行的通。

JAVA 异常汇总

不想你离开。 提交于 2020-02-12 09:16:50
1 java.lang.ArithmeticException: / by zero 原因:当我们定义的被除数为整型时(short、int、long)会抛出此异常, 被除数为整型时不可为零。 解决办法:检查整型的被除数。 2 java.lang.NumberFormatException at java.math.BigDecimal. 原因:使用变量运算过程中,对数据进行类型转换成BigDecimal。但值为null or "" or "-" 等异常值. 解决办法:在计算之前做逻辑判断处理数据。 3 java.lang.nullpointerexception 原因:运算过程中,针对对象中的成员变量运行,但值为空。当进行get 操作时候出现空指针(get操作是经常出现空指针的地方)。 解决办法:根据console 提示的代码错误行。进行数据处理。 4 java.lang.classnotfoundexception 原因:根据提示可知为访问类不存在。 解决办法:根据console 提示,检查类是否存在(名称、位置是否正确)。 5 java.lang.arithmeticexception 原因:这个异常的解释是"数学运算异常",比如程序中出现了除以零这样的运算就会出这样的异常。 解决办法:检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥。 6 java.lang

每天AC系列(十三):两数相除

风流意气都作罢 提交于 2020-02-05 22:24:52
1 题目 LeetCode第29题 ,计算两数相除的商,不允许使用乘法,除法,求模运算符。 2 减法 首先判断结果是否需要加上负号,将商置为0后,被除数不断减去除数,同时商自增。最后根据是否有负号返回相应的商。 boolean negative = true; if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) negative = false; dividend = dividend > 0 ? dividend : -dividend; divisor = divisor > 0 ? divisor : -divisor; int result = 0; while(dividend >= divisor) { dividend -= divisor; ++result; } return negative ? -result : result; 3 思考 3.1 溢出 -2147483648与2147483647这两个数,是4字节的int的最小值与最大值,在java中,它们可用Integer.MIN_VALUE与Integer.MAX_VALUE表示,当一个int为Integer.MIN_VALUE时,取反也是这个数: 最简单最粗暴的解决方案就是使用long,long可以放下-Integer

PAT乙级1017

不打扰是莪最后的温柔 提交于 2020-01-22 23:17:56
1017 A除以B (20分) 题目地址: https://pintia.cn/problem-sets/994805260223102976/problems/994805305181847552 本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。 输入格式: 输入在一行中依次给出 A 和 B,中间以 1 空格分隔。 输出格式: 在一行中依次输出 Q 和 R,中间以 1 空格分隔。 输入样例 123456789050987654321 7 输出样例 17636684150141093474 3 我的理解 A为不超过1000位的正整数,不是不超过1000,是1000位。用string存储,B是一位正整数,short即可。好像是大整数的除法问题的简化,除数只有一位,循环遍历A,将A中的字符转化为数值进行计算,将每次的商转化为字符串拼接,每次的余数参与下一次的被除数。两点注意。 在循环遍历时,有可能会出现余数为0的情况,如果余数为0,则只有下一字符作为被除数,例如321 / 3,第一步的商为1,但是余数为0,下一步的被除数为2。 最终的商可能出现以0开始的字符串,例如123 / 2,按照这种逐步计算相除的方式,商最后为061,此时则需要将前面的0给去掉。 代码段 #include

汇编语言第七、八章总结

无人久伴 提交于 2020-01-10 01:45:29
and和or指令 1. and指令——逻辑与指令,按位进行与运算,通过该指令可将操作对象的相应位设为0,其他位不变 2. or指令——逻辑或指令,按位进行或运算,通过该指令可将操作对象的相应位设为1,其他位不变 以字符形式给出的数据 1. 以“...”的方式指明数据是以字符的形式给出的,编译器把它们转化为相应的ASCII码 大小写转换的问题 1. 大写字母+20H=小写字母;小写字母-20H=大写字母 2. and al,11011111B 可将小写字母变为大写字母;or al,00100000B 可将大写字母变为小写字母 [bx+idata] 1. 表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata) si和di 1. 是和bx功能相近的寄存器,但是si和di不能够分成两个8位寄存器来使用 [bx+si]和[bx+di] 1. [bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)(即bx中的数值加上si中的数值) [bx+si+idata]和[bx+di+idata] 1. [bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata(即bx中的数值加上si中的数值再加上idata) ( 一般来说,在需要暂存数据的时候,我们都应该使用栈 ) bx、si、di和bp 1. 只有这四个寄存器可以用在[...

数据处理的两个基本问题

北慕城南 提交于 2019-12-18 08:15:15
计算机是进行数据处理,运算的机器,所以存在两个问题: 处理的数据的位置 处理的数据的长度 这两个问题,必须在机器指令中给出说明(有时候是明确的,有时候是隐式的),否者计算器就无法工作。 定义的描述性符号: reg(寄存器):ax,bx,cx,dx,ah,al···sp,bp,si,di sreg(段寄存器):ds,ss,cs,es bx,si,di和bp 总结: 在8086中, 只有 这四个寄存器可以用在 [...] 中进行内存寻址。 在 [...] 中,他们可以单个出现,或者以组合形式出现(组合中不能有其他寄存器,但可以有idata) bp的默认段地址在ss中(和bx,si,di在ds中不同) 机器指令处理的数据在什么地方 数据处理大致可分为三类:读取,写入,运算 指令执行前,所要处理的数据可以在3个地方:cpu内部,内存,端口 汇编语言中数据位置的表达 立即数(idata) 对于直接包含在机器指令中的数据(执行前在cpu的指令缓冲器中),在汇编语言中称为:立即数(idata) 寄存器 指令要处理的数据存放在寄存器中,给出对应寄存器名 段地址(SA)和偏移地址(EA) 内存中的数据,通过SA+EA给出数据位置 寻址方式 定位内存单元的方法,即称为寻址方式 指令要处理的数据有多长 前面将到分为隐式给出和显式给出,例如通过寄存器和push,pop等方法就是隐式给出。

Leetcode29题两数相除

喜你入骨 提交于 2019-12-04 04:18:47
题目 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 示例一: 输入: dividend = 10, divisor = 3 输出: 3 示例二: 输入: dividend = 7, divisor = -3 输出: -2 说明: 1.被除数和除数均为 32 位有符号整数。 2.除数不为 0。 3.假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。 题解 本题利用二分思想来模拟除法运算操作,每轮不是减去除数,而是减去所能减掉的最大数,通过位运算来快速定位出所能减去的最大数。为了防止出现int型所表示的最小负数转换为正数的溢出情况,先把所有数都转换为负数进行处理,采用异或运算来快速定位结果符号。具体方法如代码所示: class Solution { public int divide(int dividend, int divisor) { //参考题解区解法,将所有的数转换为负数进行求解 boolean sign = (dividend > 0) ^ (divisor > 0); if(dividend > 0){ dividend = -dividend;

数据结构课设:高精度算法

匿名 (未验证) 提交于 2019-12-03 00:18:01
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。 . 由于计算机运算是有模运算,数据范围的表示有一定限制,如整型int(C++中int 与long相同)表达范围是(-2^31~2^31-1),unsigned long(无符号整数)是(0~2^32-1),都约为几十亿.如果采用实数型,则能保存最大的double只能提供15~16位的有效数字,即只能精确表达数百万亿的数.因此,在计算位数超过十几位的数时,不能采用现有类型,只能自己编程计算。 ―― [ 百度百科 ] 题目 : ① 整数长度在一百位以上 ② 实现两长整数的加减乘除操作,除法要返回商和余数 ③ 输入输出均在文件中 高精度计算时一般用一个数组来存储一个数,数组的一个元素对应于数的一位(当然,在以后的优化中为了加快计算速度,也可用数组的一个元素表示数的多位数字),表示时

29. 两数相除

匿名 (未验证) 提交于 2019-12-03 00:05:01
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 示例 2: 输入: dividend = 7, divisor = -3 输出: -2 说明: 被除数和除数均为 32 位有符号整数。 除数不为 0。 /* 解题思路: 因为输入的都是int型,比如被除数是-2147483648,在int范围内,当除数是-1时, 结果就超出了int范围,需要返回INT_MAX,所以对于这种情况我们就在开始用if判定, 将其和除数为0的情况放一起判定,返回INT_MAX */ #include <iostream> using namespace std ; class Solution { public : int divide ( int dividend , int divisor ) { if ( dividend <= - 2147483648 && divisor == - 1 ) return 2147483647 ; int re = dividend / divisor ; return re ; } }; int main (){ int d ; int c ;

汇编语言-第三版-王爽-课程设计

匿名 (未验证) 提交于 2019-12-02 23:43:01
课程设计1(p211)、 课程设计1(p211) # 执行结果 # code ; DATE: 20190614 ; DESCRIPTION: 在屏幕上按格式显示数据 assume cs:code data segment db 16 dup (0) ; 用于临时保存数据转字符串的结果 ; 年份 db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983' db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992' db '1993', '1994', '1995' ; 收入 dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97497, 140417, 197514 dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000 ; 雇员 dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226 dw 11542, 14430, 15257,