### 思路分析

	/**
* 两数之和的思路
*
* @param ds
* @return
*/

public int countPairs2(int[] ds) {
int mod = (int) 1e9 + 7;
int n = ds.length;
long ans = 0;
//hashMap用来记录每个数据出现的次数
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
int x = ds[i];
for (int other : map.keySet()) {
int num = other + x;
//(num & num - 1) == 0代表num为2的若干次幂
if (num>0 && (num & num - 1) == 0) {
ans += map.get(other);

}
}
map.put(x, map.getOrDefault(x, 0) + 1);
}
return (int) (ans % mod);
}


		int max = 1 << 22;
for (int x : ds) {
for (int i = 1; i < max; i <<= 1) {

}

}

	public int countPairs3(int[] ds) {
int mod = (int) 1e9 + 7;
int max = 1 << 22;
Map<Integer, Integer> map = new HashMap<>();
int ans = 0;
for (int x : ds) {
for (int i = 1; i < max; i <<= 1) {
int t = i - x;
if (map.containsKey(t)) {
ans += map.get(t);
if (ans >= mod)
ans -= mod;
}
}
map.put(x, map.getOrDefault(x, 0) + 1);
}
return ans;
}

### 知识点拓展

	boolean check(long x) {
// 方法一
// long cur = 1;
// while (cur < x) {
// cur = cur * 2;
// }
// return cur == x;

// 方法二
return getVal(x) == x;
}

// 主要功能是返回一个比给定整数大且最接近的2的幂次方整数
// 如给定10，返回2的4次方16.
long getVal(long x) {
long n = x - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return n < 0 ? 1 : n + 1;
}