static void Main()
        {
            BitArray test = new BitArray(32);
            Console.WriteLine(test[5]);
            test[5] = 1;
            Console.WriteLine(test[5]);
            Console.WriteLine(test);

            BitArray max = new BitArray(100000);
            max[99999] = 1;
            Console.WriteLine(max);
            Console.WriteLine(max & test);
        }
        public static BigInteger BitArrayToDecimalString(BitArray arr)
        {
            BigInteger decimalResult = new BigInteger();

            for (int i = 0; i < arr.Size; i++)
            {
                if (arr[i] != 1)
                {
                    continue;
                }

                BigInteger powerOfTwo = new BigInteger(1);
                for (int j = 0; j < i; j++)
                {
                    powerOfTwo *= 2;
                }

                decimalResult += powerOfTwo;
            }

            return decimalResult;
        }
        public static BitArray operator ~(BitArray arr)
        {
            BitArray result = new BitArray(arr.Size);

            for (int i = 0; i < arr.Size; i++)
            {
                result[i] = arr[i] ^ 1;
            }

            return result;
        }
        public static BitArray operator &(BitArray arr1, BitArray arr2)
        {
            int max = Math.Max(arr1.Size, arr2.Size);
            int min = Math.Min(arr1.Size, arr2.Size);

            BitArray result = new BitArray(max);

            for (int i = 0; i < min; i++)
            {
                result[i] = arr1[i] & arr2[i];
            }

            return result;
        }
        public static BitArray operator |(BitArray arr1, BitArray arr2)
        {
            int max = Math.Max(arr1.Size, arr2.Size);
            int min = Math.Min(arr1.Size, arr2.Size);
            BitArray biggerArray = arr1.Size < arr2.Size ? arr2 : arr1;

            BitArray result = new BitArray(max);

            for (int i = 0; i < min; i++)
            {
                result[i] = arr1[i] | arr2[i];
            }

            for (int i = min; i < max; i++)
            {
                result[i] = biggerArray[i];
            }

            return result;
        }