Bit Manipülasyonları - 1. Kısım

mail@pastecode.io avatar
unknown
csharp
3 years ago
1.7 kB
22
Indexable
Never
        /// <summary>
        /// Verilen sayı 2'nin bir tam kuvveti mi?
        /// </summary>
        static bool IsPowerOfTwo(int i)
        {
            return i > 0 && (i & (i - 1)) == 0;

            // 2 --> 10
            // 4 --> 100
            // 8 --> 1000 ve 7 --> 0111

            // 1000
            // 0111
            // &
            // 0000
        }

        /// <summary>
        /// Verilen iki değeri değiştirme
        /// </summary>
        static void Swap(int a, int b)
        {
            a ^= b;
            b ^= a;
            a ^= b;

            // a --> 11 ve b --> 10
            // a ^= b; sonrası a -> 01
            // b ^= a; sonrası b -> 11
            // a ^= b; sonrası a -> 10
        }

        /// <summary>
        /// İstediğimiz pozisyondaki bit'i 1 yapar.
        /// </summary>
        static int SetBit(int x, int position)
        {
            int mask = 1 << position;
            return x | mask;

            // position 1, x = 5 yani 101 olsun.
            // mask 10 olur.
            //
            // 101 
            // 010
            // |
            // 111 yani 7 değerini verir.
        }

        /// <summary>
        /// İstediğimiz pozisyondaki bit'i 0 yapar
        /// </summary>
        static int ClearBit(int x, int position)
        {
            int mask = 1 << position;
            return x & ~mask;

            // position 1, x = 7 yani 111 olsun.
            // mask 010 olur.
            // ~mask tüm bitleri tersine çevirerk 101 yapar.
            // 
            // 111
            // 101
            // &
            // 101 yani 5 değerini verir.
        }