Divide Two Integers

原题链接Divide Two Integers

意思是重新实现除法运算,这里不要复习一下用位运算实现加减乘除四则运算
C++学习笔记—–用位运算实现加减乘除以前也有记录过,这里主要是复习,另外,除法需要优化,在这里实现


加法

通过异或运算和与运算实现
两个二进制数相加,异或运算的结果是不考虑进位时的结果
两个二进制数相加,与运算的结果是对应为是否有进位

0101 + 0001 = 01100101 ^ 0001 = 0100
0101 & 0001 = 0001
异或结果表明,如果不考虑进位,那么结果为0100
与运算结果表明,最低位需要向次低位进1算式改为0100 + 00010(与结果左移一位,将进位加到高位上)
计算结果0101

代码实现

int add(int a, int b)
{return b == 0 ? a : add(a ^ b, (a & b) << 1);
}

减法

同加法,减去一个数等于加一个数的相反数

int negative(int n)
{return add(~n, 1);
}int sub(int a, int b)
{return add(a, negative(b));
}

乘法

笔算二进制乘法

        0101    a×   0110    b----------------
        000001010101+ 0000-------------
     00011110

b的每一位乘a,左移一定位数后加到结果上,代码把逻辑实现出来就可以了。可以在代码中每加一次结果就将a左移一位,就不需要每次算完都左移。最好考虑符号问题,乘之前都转为正数

int get_sign(int n)
{if(n >> 31)return 1;elsereturn 0;
}int positive(int n)
{if(n >> 31)return negative(n);elsereturn n;
}int multi(int a, int b)
{bool be_negative = false;if(get_sign(a) ^ get_sign(b))be_negative = true;unsigned int x = positive(a);unsigned int y = positive(b);int n = 0;while(y | 0){if(y & 1)n = add(n, x);x = x << 1;y = y >> 1;}return be_negative ? negative(n) : n;
}

除法

第一种方法,每次循环都是a-b,看能减多少次,如果a很大b很小,效率比较低
第二种方法,从最大倍数n开始,看看a / n 是否大于b,如果大,将n加到结果上,然后缩小倍数继续循环

int div(int a, int b)
{bool be_negative = false;if(get_sign(a) ^ get_sign(b))be_negative = true;unsigned int x = positive(a);unsigned int y = positive(b);int res = 0;int i = 31;while(i >= 0){if((x >> i) >= y){res = add(res, 1 << i);x = sub(x, y << i);}/* 也可以在else里,因为这里是int型,最大也就1 << 31倍 */i = sub(i, 1);}/* 题中要求溢出时为INT_MAX,实现时可以让它溢出 *///if(res < 0 && !be_negative)//    return INT_MAX;return be_negative ? negative(res) : res;}

完整测试程序如下

#include <iostream>
#include <climits>
#include <random>using namespace std;class Solution {
public:int add(int a, int b){return b == 0 ? a : add(a ^ b, (a & b) << 1);}int sub(int a, int b){return add(a, negative(b));}int get_sign(int n){if(n >> 31)return 1;elsereturn 0;}int negative(int n){return add(~n, 1);}int positive(int n){if(n >> 31)return negative(n);elsereturn n;}int multi(int a, int b){bool be_negative = false;if(get_sign(a) ^ get_sign(b))be_negative = true;unsigned int x = positive(a);unsigned int y = positive(b);int n = 0;while(y | 0){if(y & 1)n = add(n, x);x = x << 1;y = y >> 1;}return be_negative ? negative(n) : n;}int div(int a, int b){bool be_negative = false;if(get_sign(a) ^ get_sign(b))be_negative = true;unsigned int x = positive(a);unsigned int y = positive(b);int res = 0;int i = 31;while(i >= 0){if((x >> i) >= y){res = add(res, 1 << i);x = sub(x, y << i);}i = sub(i, 1);}//if(res < 0 && !be_negative)//    return INT_MAX;return be_negative ? negative(res) : res;}
};int main()
{Solution s;srand(unsigned(time(NULL)));int maxIteration = 10000;while(maxIteration--){int a = rand() - INT_MAX / 2;int b = rand() - INT_MAX / 2;if(s.add(a, b) != a + b)cout << "error : " << a << " + " << b << endl;if(s.sub(a, b) != a - b)cout << "error : " << a << " - " << b << endl;if(s.multi(a, b) != a * b)cout << "error : " << a << " * " << b << " " << s.multi(a, b) << " " << a * b << endl;if(b != 0 && s.div(a, b) != a / b)cout << "error : " << a << " / " << b << endl;}return 0;
}

每天一道LeetCode----位运算实现加减乘除四则运算相关推荐

  1. java实现三位数加减乘除_用Java位运算实现加减乘除四则运算

    感谢博客:http://blog.csdn.net/itismelzp/article/details/49621741  提供的思路. 要用位运算来实现四则运算,不仅仅要知道&,|,~,^, ...

  2. 位运算实现加减乘除四则运算(Java)

    本文是继<一文了解有趣的位运算>的第二篇文章. 我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平.无论多么复 ...

  3. java 模拟 减法 进位_位运算实现加减乘除四则运算(Java)

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 本文是继< ...

  4. 位运算实现加减乘除四则运算

    目录 加法 减法 乘法 除法 计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平.无论多么复杂的逻辑.庞大的数据.酷炫的界面,最终体 ...

  5. python 位运算实现加减乘除四则运算

    写在前面:加法在测试时遇到了一个问题,用python在算-4+8时,会无限循环 我打印了每一次的sum和carry,原来是carry会越来越大 到后面会非常大 但是我试了下C++发现是可以计算的,它溢 ...

  6. 【C++】位运算实现加减乘除

    1 #include<iostream> 2 #include<assert.h> 3 using namespace std; 4 5 // 位运算实现加减乘除 6 7 in ...

  7. 只使用位运算实现加减乘除

    在线OJ: LeetCode 29. 两数相除 原题目的要求是不能使用乘法, 除法和取余运算符实现除法. 在本篇博客中把题目要求提高一点, 这里只使用位运算来实现, 顺便的也就把只使用位运算实现加减乘 ...

  8. C++学习笔记-----用位运算实现加减乘除

    C++学习笔记-----用位运算实现加减乘除 原文:http://blog.csdn.net/sinat_35261315/article/details/72904945 数据在计算机内存中是以二进 ...

  9. java加减_Java位运算实现加减乘除

    一.加法 a+b 举例实现:13+9=22 13+9不考虑进位结果为12 只考虑进位结果为10 和刚好是22. 13二进制为1101,9二进制为1001. 不考虑进位结果为0100.算式为a^b 只考 ...

最新文章

  1. linux 查找目录或文件详解
  2. Solr在Weblogic中部署遇到的问题
  3. 后台开发经典书籍--图解http
  4. 自学ng2 -生命周期钩子
  5. Swift之捕捉侧滑返回事件并跳转指定控制器
  6. 第七十七期:可自动生成代码,5款基于AI的开发工具
  7. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]47.什么是Fiat-Shamir变换?
  8. JavaWeb笔记:JDBC总结
  9. 七牛云图片--Java文档
  10. 计算机控制考试试卷及答案,计算机控制系统A考试试卷带答案.doc
  11. css sgc加密,ASP+SGC实现柱状图
  12. 腾讯云对象存储(cos) js jdk上传文件
  13. 2014-10-18 多玩初面
  14. 95 费解的开关(递推)
  15. JAVA匹配所有英文_java匹配汉字、英文、数字
  16. html设置返回首页,html页面添加返回顶部按钮
  17. English trip V1 - 3.What Would you Like? Teacher:Lamb Key: would like to
  18. Linux 中的TAB键名字补全使用方法
  19. 求空间中点到线的最短距离(Revit二次开发)
  20. 面向对象:面向对象程序设计

热门文章

  1. 数字调相用计算机实现的步骤,第2章数据通信习题
  2. 电脑编程用户注册界面java_用JSP/Servlet开发简单的用户注册系统
  3. BZOJ3473: 字符串【后缀数组+思维】
  4. WEBBASE篇: 第八篇, JavaScript知识2
  5. python_day_5:20180720
  6. CSS cursor 属性
  7. iOS开发——多线程篇——GCD
  8. MySQL性能调优与架构设计——第4章 MySQL安全管理
  9. 简易的设计模式——原型模式
  10. arp攻击源代码(收集)