使用位操作实现加减乘除运算
2017-04-20 22:33
323 查看
前言
在实际应用中一定要注意边界问题,包括上边界和下边界
注意:
位操作中常用的公式
a=n&(n-1);//去掉n中最右边的1;
b=n&(-n);//得到n中最右边的1
-n==~n+1;
-n==~(n-1);
代码:
/*在正式应用中一定要注意边界问题,包括上边界和下边界*/
#include<iostream>
#include<map>
using namespace std;
int add(int a, int b)
{
if (a==0)
{
return b;
}
int carry = (a&b)<<1;
int adder = a^b;
return add(carry, adder);
}
int substract(int a, int b)
{
return add(a, -b);
}
int mulit(int a, int b)
{
bool _ = (a > 0)^(b > 0);
a = abs(a);
b = abs(b);
int ans=0;
map<int, int> bitmap;
for (size_t i = 0; i < 32; i++)
{
bitmap[1 << i] = i;
}
while (b>0)
{
int carry = bitmap[b&(-b)];
b = b ^ (b&(-b));
ans += a << carry;
}
return _ ? -ans : ans;
}
int divide(int a, int b)
{
bool _ = (a > 0)^(b > 0);
a = abs(a);
b = abs(b);
int ans = 0;
while (a >= b)
{
int m = 1;
int nb = b;
while ((nb<<1)<a)
{
nb <<= 1;
m <<= 1;
}
ans += m;
a -= nb;
}
return _ ? -ans : ans;
}
int main()
{
int a = -26;
int b = 3;
cout << "和:" << add(a, b) << endl;
cout << "差:" << substract(a, b) << endl;
cout << "积:" << mulit(a, b) << endl;
cout << "商:" << divide(a, b) << endl;
}结果:
在实际应用中一定要注意边界问题,包括上边界和下边界
注意:
位操作中常用的公式
a=n&(n-1);//去掉n中最右边的1;
b=n&(-n);//得到n中最右边的1
-n==~n+1;
-n==~(n-1);
代码:
/*在正式应用中一定要注意边界问题,包括上边界和下边界*/
#include<iostream>
#include<map>
using namespace std;
int add(int a, int b)
{
if (a==0)
{
return b;
}
int carry = (a&b)<<1;
int adder = a^b;
return add(carry, adder);
}
int substract(int a, int b)
{
return add(a, -b);
}
int mulit(int a, int b)
{
bool _ = (a > 0)^(b > 0);
a = abs(a);
b = abs(b);
int ans=0;
map<int, int> bitmap;
for (size_t i = 0; i < 32; i++)
{
bitmap[1 << i] = i;
}
while (b>0)
{
int carry = bitmap[b&(-b)];
b = b ^ (b&(-b));
ans += a << carry;
}
return _ ? -ans : ans;
}
int divide(int a, int b)
{
bool _ = (a > 0)^(b > 0);
a = abs(a);
b = abs(b);
int ans = 0;
while (a >= b)
{
int m = 1;
int nb = b;
while ((nb<<1)<a)
{
nb <<= 1;
m <<= 1;
}
ans += m;
a -= nb;
}
return _ ? -ans : ans;
}
int main()
{
int a = -26;
int b = 3;
cout << "和:" << add(a, b) << endl;
cout << "差:" << substract(a, b) << endl;
cout << "积:" << mulit(a, b) << endl;
cout << "商:" << divide(a, b) << endl;
}结果:
相关文章推荐
- 新浪面试题:只允许使用++操作符实现加减乘除运算(c语言版)
- 不使用 +-×÷ 运算符来实现 加减乘除 四项运算
- 新浪面试题:只允许使用++操作符实现加减乘除运算(c语言版)
- 位运算---只使用位运算实现整数的加减乘除
- 电商网站中价格的精确计算(使用BigDecimal进行精确运算(实现加减乘除运算))
- 使用策略模式实现加减乘除运算
- 分别使用委托、接口、匿名方法、泛型委托实现加减乘除运算
- 不使用 +-×÷ 运算符来实现 加减乘除 四项运算
- 不使用 +-×÷ 运算符来实现 加减乘除 四项运算
- 使用BigDecimal进行精确运算(实现加减乘除运算) 详细出处参考:http://www.jb51.net/article/43513.htm
- 位操作实现加减乘除四则运算
- java实现四则运算,难点主要在理解加减乘除优先级以及使用递归
- 深入理解异或运算 xor 的含义——再探不使用加减乘除实现加法运算、不使用额外空间交换两个变量的值
- C++语言使用字符数组实现大数加减乘除运算
- 使用Object-c类实现简单地加减乘除运算
- 使用BigDecimal进行精确运算(实现加减乘除运算)
- 新浪面试题:只允许使用++操作符实现加减乘除运算(c语言版)
- 使用BigDecimal实现精确加减乘除运算
- 不使用 +-×÷ 运算符来实现 加减乘除 四项运算
- 使用“位运算”实现“四则运算”之加减乘除