位运算实现加减乘除
一. 位运算的基本操作
A = 0011 1100
B = 0000 1101
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | 如果相对应位都是0,则结果为0,否则为1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
? | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0 | (?A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
- 不考虑进位的按位求和, 异或
- 只考虑进位,只有(1,1)才会产生进位,使用按位与可以满足要求。 当前位产生进位,要参与高一位的运算,因此按位与后要向左移动一位。
- 递归求和,直到进位为0
int add(int a,int b) {
int carry,add;
do{
add = a^b;
carry = (a&b)<<1;
a = add;
b=carry;
}while(carry!=0);
return add;
}
三. 减法 先转换为加法: a-b = a+(-b) = a+(~b+1)
int subtract(int a,int b){
return add(a,add(~b,1));
}
四. 乘法 【位运算实现加减乘除】
我也没看懂, 抄的.
// 正整数的乘法
int multiply(int a,int b){
int ans = 0;
while(b){
if(b&1)
ans = add(ans, a);
a = a<<1;
b = b>>1;
}
return ans;
}
五. 除法
int divide(int a, int b){
int count=0;
while(a>=b){
a = subtract(a,b);
count = add(count,1);
}
return count;
}
// 改进的除法:
int div(const int x,const int y){
int left_num=x;
int result=0;
while(left_num>=y){
int multi=1;
while(y*multi<=(left_num>>1))
{
multi=multi<<1;
}
result+=multi;
left_num-=y*multi;
}
return result;
}
推荐阅读
- 2018-02-06第三天|2018-02-06第三天 不能再了,反思到位就差改变
- Shell-Bash变量与运算符
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 发小的串门
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现