// Get array, indicating which data members should be swapped before FFT private static int[] GetReversedBits(int numberOfBits) { if ((numberOfBits < minBits) || (numberOfBits > maxBits)) { throw new ArgumentOutOfRangeException(); } // check if the array is already calculated if (reversedBits[numberOfBits - 1] == null) { int n = Tools.Pow2(numberOfBits); int[] rBits = new int[n]; // calculate the array for (int i = 0; i < n; i++) { int oldBits = i; int newBits = 0; for (int j = 0; j < numberOfBits; j++) { newBits = (newBits << 1) | (oldBits & 1); oldBits = (oldBits >> 1); } rBits[i] = newBits; } reversedBits[numberOfBits - 1] = rBits; } return(reversedBits[numberOfBits - 1]); }