Понимание этого фрагмента кода _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 0
s
~
я верю, что поразрядно нет, так что это применимо к вышесказанному и в результате 0, а затем 1
s
&
является побитовым, и это приводит к применению побитовой операции и к обоим операндам
В конечном счете это, кажется, фильтрует это до 63 бит данных, так как любые старшие биты будут обнулены из-за и
Причина, по которой это работает для принудительной установки положительного значения, заключается в том, что обычно старший бит (#64 в вашем случае) используется в качестве знакового бита в большинстве нотаций, и этот код просто по существу 0
с этим, заставляя его быть не отрицательным, то есть положительным
a = ~(1L << 63) = ~0x1000000000000000 = 0x7fffffffffffffff
так m &= a
очищает самый высокий бит m
таким образом гарантируя, что это положительно, предполагая, что используется кодирование двух чисел со знаком в виде целых чисел.