使用Java在整数上执行位混洗的更快方法

我想知道是否有更快的方法来改变整数的位而不是以下

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);
 }
上一篇:关于 锁的四种状态与锁升级过程 图文详解


下一篇:俄罗斯黑客成功劫持Windows Update的下载器