namespace ZeroLevel
{
    public static class NumberBitsExtensions
    {
        private const int ONE_I = 1;
        private const uint ONE_UI = 1U;
        private const long ONE_L = 1L;
        private const ulong ONE_UL = 1UL;

        public static ulong SetBit(this ulong k, int position)
        {
            k |= (ONE_UL << position);
            return k;
        }

        public static ulong ResetBit(this ulong k, int position)
        {
            k &= ~(ONE_UL << position);
            return k;
        }

        public static long SetBit(this long k, int position)
        {
            k |= (ONE_L << position);
            return k;
        }

        public static long ResetBit(this long k, int position)
        {
            k &= ~(ONE_L << position);
            return k;
        }

        public static int SetBit(this int k, int position)
        {
            k |= (ONE_I << position);
            return k;
        }

        public static int ResetBit(this int k, int position)
        {
            k &= ~(ONE_I << position);
            return k;
        }

        public static uint SetBit(this uint k, int position)
        {
            k |= (ONE_UI << position);
            return k;
        }

        public static uint ResetBit(this uint k, int position)
        {
            k &= ~(ONE_UI << position);
            return k;
        }
    }
}