基本性質: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