71 lines
1.6 KiB
C#
71 lines
1.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|