using System.Text; namespace BitStrap { public static class BitHelper { private const int IntSize = 32; private static readonly int[] randIntsArray = new int[32]; private static readonly bool[] bitsArray = new bool[32]; private static readonly StringBuilder stringBuilder = new StringBuilder(32); private static readonly FastRandom fastRandom = new FastRandom(); public static string ToBinaryString(this int v) { stringBuilder.Length = 0; for (int i = 0; i < 32; i++) { int num = 1 << i; bitsArray[i] = (v & num) != 0; } for (int num2 = 31; num2 >= 0; num2--) { stringBuilder.Append((!bitsArray[num2]) ? '0' : '1'); } return stringBuilder.ToString(); } public static int ShuffleBits(int num, int key, int offset = 0) { fastRandom.SetSeed(key); num += offset; for (int i = 0; i < 32; i++) { int nextInt = fastRandom.GetNextInt(); num = SwapBits(num, i, nextInt % 32); } return num; } public static int UnshuffleBits(int num, int key, int offset = 0) { fastRandom.SetSeed(key); for (int i = 0; i < 32; i++) { randIntsArray[i] = fastRandom.GetNextInt(); } for (int num2 = 31; num2 >= 0; num2--) { int num3 = randIntsArray[num2]; num = SwapBits(num, num2, num3 % 32); } return num - offset; } public static int SwapBits(int num, int indexA, int indexB) { int num2 = 1 << indexA; int num3 = 1 << indexB; bool flag = (num & num2) != 0; bool flag2 = (num & num3) != 0; num = ((!flag) ? (num & ~num3) : (num | num3)); num = ((!flag2) ? (num & ~num2) : (num | num2)); return num; } } }