0%

二进制

二进制

二进制与Swap



1
2
3
4
5
void Swap(int& a,int& b){
a^=b;
b^=a;
a^=b;
}

最后一位1

判断是否是2的幂(只有一个1)

数组中只出现一次的数

数组中只有一个数字出现了一次,其他数字都出现了两次,找出只出现了一次的这个数字

二进制与组合



二进制与四则运算

leetcode.面试题65. 不用加减乘除做加法


写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。


1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int add(int a, int b) {
int n, c;
while (b | 0x0 != 0) {
n = a ^ b;
c = (unsigned int)(a&b) << 1;
a = n;
b = c;
}
return a;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int add(int a, int b) {
int n, c;
while (b | 0x0 != 0) {
n = a ^ b;
c = ((a&b)&(~0x80000000)) << 1;
a = n;
b = c;
}
return a;
}
};
1
2
3
4
5
6
7
8
9
10
class Solution {
public:
int add(int a, int b) {
while (b!= 0) {
a = a ^ b;
b = (((a^b)&b)&(~0x80000000)) << 1;
}
return a;
}
};

二进制实现乘法



两个正整数相乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
int add(int a, int b) {
while (b!= 0) {
a = a ^ b;
b = (((a^b)&b)&(~0x80000000)) << 1;
}
return a;
}
int mul(int a, int b) {
int c = 0;
while (b != 0) {
b >>= 1;
a <<= 1;
if ((b & 0x1) != 0x0) {
c = add(c , a);
}
}
return c;
}
};

参考

浅谈信息学竞赛中的“0”和“1”