47 - 按位实现加减乘除 四则运算

不使用+-*/四则运算符,实现两个数的四则运算。


1. 加

用二进制位实现两个数之间的加法。不考虑2个数相加的和溢出问题。

如 9+15=24

1001 + 1111,由于二进制 0+0=0,1+0=1, 0+1=1, 1+1=0, 可以发现是异或运算,而产生进位,则只有1 ,1相加,即与运算。

int add(int nums1, int nums2) {
    if (nums1 == 0 || nums2 == 0)
        return (nums1 == 0) ? nums2 : nums1;
    int sum = 0, carry = 0;
    do {
        sum = nums1 ^ nums2;
        carry = (nums1 & nums2) << 1; // 进位左移一位
        nums1 = sum;
        nums2 = carry;
    } while (nums2);
    return sum;
}

2. 减

a-b = a + (-b),只需要实现负数操作,即求补码:按位取反 + 1

int negtive(int num) {
    return add(~num, 1);
}
int sub(int nums1, int nums2) {
    return add(nums1, negtive(nums2));
}

3. 乘

如十进制中的乘法,逐位乘。

求 2 个正整数的乘积

int multi(int nums1, int nums2) {
    if (nums1 == 0 || nums2 == 0)
        return 0;
    int result = 0;
    while (nums2) {
        if (nums2 & 0x01) { // 乘数的最后1位
            result = add(result, nums1);
        }
        nums1 <<= 1; // 被乘数左移1位
        nums2 >>= 1; // 取乘数的下一位
    }
    return result;
}

4. 除

求两个正整数相除的商。

乘的逆运算。

除法就是由乘法的过程逆推,x/y的过程: x依次减掉(如果x够减的)y^(2^31),y^(2^30),…y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。

int division(int nums1, int nums2) {
    if (nums1 == 0 || nums2 == 0)
        return 0;
    const int BITS = sizeof(nums1)*8;
    int result = 0;
    for (int i = BITS-1; i >= 0; i--) {
        // 之所以不使用 nums2 << i 与 nums1 比较,是为了防止溢出
        if ((nums1 >> i) > nums2) {
            result = add(result, 1 << i);
            nums1 = sub(nums1, nums2 << i);
        }
    }
    return result;
}

参考:http://blog.csdn.net/hackbuteer1/article/details/7390093

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 17:38:51

47 - 按位实现加减乘除 四则运算的相关文章

大数运算实现加减乘除四则运算

首先,让我们先来熟悉一下两种防止头文件被重复引用的处理#pragma once和#ifndef的区别 http://10739786.blog.51cto.com/10729786/1730827 接下来,开始我们的主题 <大数运算>    在平时生活中细心的你可能会发现,好多时候我们使用计算器时,总有一个显示的最大值,当计算超过这个值时就不能再计算了,那如果我们想要计算更大的数值要怎么办? 本文通过C++编程实现 大数的加减乘除四则运算 <思路与方法同样都在程序内部> 这次通过标

Qt之加减乘除四则运算-支持负数

一.效果展示 如图1所示,是简单的四则运算测试效果,第一列为原始表达式,第二列为转换后的后缀表达式,冒号后为结果.表达式支持负数和空格,图中是使用了5组测试数据,测试结果可能不全,如大家发现算法有问题,可留言,谢谢. 图1 四则运算展示 二.一些小技巧 在网上找了很多四则运算帖子,讲的都挺不错,思路很清晰,可是很少有拿来直接能用的,并且大多数的都不支持负数运算,既然是四则运算当然需要支持负数运算了,在这里我们只需要使用一点儿小技巧即可. 1.针对负号进行字符串修复 例如:-1*-3+2*(3+3

Java程序完成加减乘除四则运算

一.项目名称:加减乘除四则运算 二.设计思路: 1.在对话框中输入两个数,并转化为int类型 2.进行加减乘除四则运算 3.输出结果 三.流程图 四.源代码 import javax.swing.JOptionPane; public class SiZeYunSuan { public static void main(String[] args) { // TODO 自动生成的方法存根 int n1=Integer.parseInt(JOptionPane.showInputDialog("

用位运算实现四则运算之加减乘除(用位运算求一个数的1/3) via Hackbuteer1

转自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位异或:&:按位与: | :按位或 计算机系统中,数值一律用补码来表示:因为补码可以使符号位和数值位统一处理,同时可以使减法按照加法来处理. 对补码做简单介绍:数值编码分为原码,反码,补码,符号位均为0正1负. 原码 -> 补码: 数值位取反加1 补码 -> 原码: 对该补码的数值位继续 取反加1 补码 的绝对值(称为真值):正数的真值就是本身,负数的真值是各

Python基础算法综合:加减乘除四则运算方法

#!usr/bin/env python# -*- coding:utf-8 -*-#python的算法加减乘除用符号:+,-,*,/来表示#以下全是python2.x写法,3.x以上请在python(打印放入括号内) 例如:print('1+1=',1+1)print '*-----------------------------------------------------*分割符'print "1+1=",1+1 #打印加法1+1的结果2print "2-1=&quo

c++实现大数加减乘除四则运算

通过c++字符串string实现大数的加.减.乘.除 1 #include <iostream> 3 #include <cstdlib> 4 #include <vector> 6 #include <sstream> 7 #include <algorithm> 9 using namespace std; 10 11 class Solution { 12 public: 13 string addTwoString(string nums

高精度模板(含加减乘除四则运算)

高精度加高精度 1 void BigAddBig(char *a, char *b, char *c) 2 { 3 //a表示结果,b,c位加数 4 int a_int[1005] = { 0 }, b_int[1005] = { 0 }, c_int[1005] = { 0 }; 5 int len1, len2, len, i; 6 len1 = strlen(b); 7 len2 = strlen(c); 8 for (i = 0; i < len1; i++) 9 b_int[i] =

位操作实现加减乘除四则运算

常见的位操作实现 1. 常用的一个等式:-n = ~(n - 1) = ~n + 1 2. 获取整数的二进制的最右边的1:n & (-n) 或 n & ~(n - 1).例如 n = 010100, -n = 101100,那么n & (-n) = 000100 3. 去除整数的二进制的最右边的1:n & (n - 1).例如 n = 010100,n-1 = 010011,n&(n-1) = 010000 加法操作 实现加法操作使用"异或"和&

2位“随机”数四则运算

今天上课老师现场留了个小作业:产生30个随机数四则运算 遇到了些问题,因为初学JAVA,random的用法一直出错.后来网上查了查.才理解. Random rand = new Random();             int firstnum = rand.nextInt(99)+1;可以产生1到99的随机数.如果是从0开始,就是int firstnum = rand.nextInt(100);产生0到99的随机数. 以下是我的具体代码: package jian; import java.