我想知道是否有更快的方法来改变整数的位而不是以下
public int shuffleBits(int number) {
int int_width = 31;
Random random = new Random();
for(int i = 0; i < int_width; i++) {
number = swapBit(number, i, random.nextInt(int_width - i) + i);
}
}
解决方法:
您当然可以优化和改进当前的方法.
(1)我们只想在第i和第j位不同时执行交换(如果两者都是0或1则不需要交换),我们可以简单地对两个位进行翻转.最多有k个交换,其中k是设置位的数量.
(2)我们可以使用计数器并跟踪我们在循环时看到的1个,并在我们到达k时尽早退出.
public int shuffleBits(int number)
{
int int_width = 31;
int swaps = 0;
int K = Integer.bitCount(number);
int setBits = 0;
Random random = new Random();
for(int i = 0; i < int_width && setBits < K; i++) {
int j = random.nextInt(int_width - i) + i;
if(bitsAreDifferent(number, i, j)) {
number ^= (1 << i) | (1 << j);
}
if(((number >> i) & 1) == 1) setBits++;
}
return number;
}
private boolean bitsAreDifferent(int number, int i, int j) {
return ((number >> i) & 1) != ((number >> j) & 1);
}