基本性质:1:~n=-(n+1),好比:~3=-4
2:获取整数n的二进制串中最后一个1:-n&n=~(n-1)&n
3:去掉整数n的二进制串中最后一个1:n&(n-1)html
加法:(如下全部代码都是Java实现)java
1
2
3
4
5
6
7
8
9
10
11
|
public
static
int
add(
int
a,
int
b) {
int
res=a;
int
xor=a^b;
// a^b获得原位和(至关于按位相加没有进位)
int
forward=(a&b)<<
1
;
//获得进位和 a&b:获得产生进位的地方 (a&b)<<1:进位后的值
if
(forward!=
0
){
//若进位和不为0,则递归求原位和+进位和
res=add(xor, forward);
}
else
{
res=xor;
//若进位和为0,则此时原位和为所求和
}
return
res;
}
|
减法:post
1
2
3
4
|
public
static
int
minus(
int
a,
int
b) {
int
B=~(b-
1
);
// 由上面基本性质 -b=+(-b),~(b-1)=-b ===>>> a-b=a+(-b)=a+(~(b-1)
return
add(a, B);
}
|
乘法:测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public
static
int
multi(
int
a,
int
b){
/* 1011
* 1010
--------
10110 (1011<<1,至关于乘以0010)
1011000 (1011<<3,至关于乘以1000)
--------
1101110
*/
int
i=
0
;
int
res=
0
;
while
(b!=
0
){
//乘数为0则结束
//处理乘数当前位
if
((b&
1
)==
1
){
res+=(a<<i);
b=b>>
1
;
++i;
//i记录当前位是第几位
}
else
{
b=b>>
1
;
++i;
}
}
return
res;
}
|
除法:spa
1
2
3
4
5
6
7
8
9
10
|
public
static
int
sub(
int
a,
int
b) {
// 除法的意义就在于:求a能够由多少个b组成。那么由此咱们可得除法的实现:求a能减去多少个b,作减法的次数就是除法的商。
int
res=-
1
;
if
(a<b){
return
0
;
}
else
{
res=sub(minus(a, b), b)+
1
;
}
return
res;
}
|
测试代码:code
1
2
3
4
5
6
|
public
static
void
main(String args[]){
System.out.println(
"加法测试:"
+add(
10
,
5
));
System.out.println(
"减法测试:"
+minus(
10
,
5
));
System.out.println(
"乘法测试:"
+multi(
10
,
5
));
System.out.println(
"除法测试:"
+sub(
10
,
5
));
}
|
测试结果:htm