Created
December 21, 2021 15:54
-
-
Save HamedMasafi/42fa5c923f21900c492f82965f5f4340 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Threading.Tasks; | |
namespace Zabtkar.Code | |
{ | |
class BitSet<T> //where T : IComparable, IComparable<Int32>, IConvertible, IEquatable<Int32>, IFormattable | |
{ | |
Int64 _n; | |
public BitSet() | |
{ | |
_n = 0; | |
} | |
public BitSet(Int64 n) | |
{ | |
_n = n; | |
} | |
public Int64 Value { get => _n; set => _n = value; } | |
public bool Get(int index) | |
{ | |
return (_n & (1 << index)) == 1; | |
} | |
public void Set(int index, bool value) | |
{ | |
if (value) | |
_n |= (1 << index); | |
else | |
_n &= ~(1 << index); | |
} | |
public int Length() | |
{ | |
return 0;// sizeof(T) *8; | |
} | |
} | |
public class UniqueIDManager | |
{ | |
private static BitArray ToBitArray(ulong n) | |
{ | |
var bitArray = new BitArray(sizeof(ulong) * 8); | |
for (int i = 0; i < sizeof(ulong) * 8; i++) | |
bitArray.Set(i, (n & (1UL << i)) != 0); | |
return bitArray; | |
} | |
private static ulong FromBitArray(BitArray bitArray) | |
{ | |
ulong n = 0; | |
for (int i = 0; i < bitArray.Length; i++) | |
{ | |
if (bitArray.Get(i)) | |
n |= (1UL << i); | |
else | |
n &= ~(1UL << i); | |
} | |
return n; | |
} | |
private static string ToString(BitArray bitArray) | |
{ | |
string s=""; | |
for (int i = 0; i < bitArray.Length; i++) | |
{ | |
s = bitArray.Get(i) ? "1" : "0" + s; | |
} | |
return s; | |
} | |
public static ulong Encode(ulong n, ref string binary) | |
{ | |
var input = ToBitArray(n); | |
var output = new BitArray(sizeof(long) * 8); | |
output.Set(11, input.Get(17)); | |
output.Set(1, input.Get(13)); | |
output.Set(14, input.Get(1)); | |
output.Set(10, input.Get(5)); | |
output.Set(6, input.Get(9)); | |
output.Set(21, input.Get(11)); | |
output.Set(20, input.Get(18)); | |
output.Set(15, input.Get(12)); | |
output.Set(5, input.Get(3)); | |
output.Set(12, input.Get(19)); | |
output.Set(4, input.Get(10)); | |
output.Set(8, input.Get(21)); | |
output.Set(22, input.Get(22)); | |
output.Set(18, input.Get(2)); | |
output.Set(16, input.Get(20)); | |
output.Set(7, input.Get(16)); | |
output.Set(2, input.Get(8)); | |
output.Set(13, input.Get(14)); | |
output.Set(9, input.Get(4)); | |
output.Set(17, input.Get(15)); | |
output.Set(0, input.Get(7)); | |
output.Set(3, input.Get(0)); | |
output.Set(19, input.Get(6)); | |
output.Set(23, input.Get(23)); | |
binary = ToString(input); | |
return FromBitArray(output); | |
} | |
public static ulong Decode(ulong n, ref string binary) | |
{ | |
var input = ToBitArray(n); | |
var output = new BitArray(sizeof(long) * 8); | |
output.Set(17, input.Get(11)); | |
output.Set(13, input.Get(1)); | |
output.Set(1, input.Get(14)); | |
output.Set(5, input.Get(10)); | |
output.Set(9, input.Get(6)); | |
output.Set(11, input.Get(21)); | |
output.Set(18, input.Get(20)); | |
output.Set(12, input.Get(15)); | |
output.Set(3, input.Get(5)); | |
output.Set(19, input.Get(12)); | |
output.Set(10, input.Get(4)); | |
output.Set(21, input.Get(8)); | |
output.Set(22, input.Get(22)); | |
output.Set(2, input.Get(18)); | |
output.Set(20, input.Get(16)); | |
output.Set(16, input.Get(7)); | |
output.Set(8, input.Get(2)); | |
output.Set(14, input.Get(13)); | |
output.Set(4, input.Get(9)); | |
output.Set(15, input.Get(17)); | |
output.Set(7, input.Get(0)); | |
output.Set(0, input.Get(3)); | |
output.Set(6, input.Get(19)); | |
output.Set(23, input.Get(23)); | |
output.Set(24, true); | |
binary = ToString(input); | |
return FromBitArray(output); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment