Понимание этого фрагмента кода _num = (_num & ~(1L << 63));

Можно ли объяснить, что делает этот раздел кода: _num = (_num & ~(1L << 63));

Я читал на RNGCryptoServiceProvider и наткнулся на http://codethinktank.blogspot.co.uk/2013/04/cryptographically-secure-pseudo-random.html с кодом, я могу следовать большей части кода, за исключением раздел выше.

Я понимаю, что все цифры положительные, но я не знаю, как это происходит.

Полный код

public static long GetInt64(bool allowNegativeValue = false)
{
    using (RNGCryptoServiceProvider _rng = new RNGCryptoServiceProvider())
    {
         byte[] _obj = new byte[8];
         _rng.GetBytes(_obj);
         long _num = BitConverter.ToInt64(_obj, 0);
         if (!allowNegativeValue)
         {
             _num = (_num & ~(1L << 63));
         }
         return _num;
     }
}

Любая помощь, объясняющая это, будет оценена

2 ответа

Решение

<< это оператор сдвига 1L << 63 Результатом является смещение 1 влево на 63 места или 1 с последующим 63 0s

~ я верю, что поразрядно нет, так что это применимо к вышесказанному и в результате 0, а затем 1s

& является побитовым, и это приводит к применению побитовой операции и к обоим операндам

В конечном счете это, кажется, фильтрует это до 63 бит данных, так как любые старшие биты будут обнулены из-за и

Причина, по которой это работает для принудительной установки положительного значения, заключается в том, что обычно старший бит (#64 в вашем случае) используется в качестве знакового бита в большинстве нотаций, и этот код просто по существу 0с этим, заставляя его быть не отрицательным, то есть положительным

a = ~(1L << 63) = ~0x1000000000000000 = 0x7fffffffffffffff

так m &= a очищает самый высокий бит mтаким образом гарантируя, что это положительно, предполагая, что используется кодирование двух чисел со знаком в виде целых чисел.

Другие вопросы по тегам