比如给定一个数 210 (二进制表示为 11010010),其中第2、5、7、8位是1(从最右开始数),那么结果就是 [2,5,7,8]。
有什么高效的解决办法呢?
比如给定一个数 210 (二进制表示为 11010010),其中第2、5、7、8位是1(从最右开始数),那么结果就是 [2,5,7,8]。
有什么高效的解决办法呢?
直接上答案吧,我是用列表推导来做的,
[i + 1 for i, x in enumerate(list(bin(a)[::-1])) if x =='1']
后来为了更高的效率,我直接这样做了。
a = (i + 1 for i, x in enumerate(list(bin(a)[::-1])) if x =='1')
# 需要打印出来就用这个迭代呗。
for x in a:
print(x)
public static List<Integer> getBitCollections (long bits) {
List<Integer> index = new ArrayList<>();
int position = 1;
while (bits != 0) {
if ((bits & 1) != 0) {
index.add(position);
}
position++;
bits = bits >>> 1;
}
return index;
}
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
4 回答4.5k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
水平有限.
不知道你想要的高效解决方案是什么样,但是我自己试了一下,在python里,我认为应该高效的方法实际上并不高效,反而是我认为最蠢的办法效率更高.
这么跑一下反而是遍历字符串的速度更快,位运算的优势完全无法体现出来,相比来说while本身就比for要慢一些,我怀疑是这里造成的差异.
我再试了一下golang,
由于golang这个字符串方法我写的比较挣扎,速度也比位运算慢了5倍左右.
这给我的感受就是,这个操作本身因为本身就比较简单,随便增加一点边边角角的操作,就会对整体耗时造成非常大的影响,的去提升他的效率可能一不小心就负优化了.