Files
2026-02-21 16:45:37 +08:00

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;
}
}
}