1

任何人都可以解释这部分代码的作用:_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;
     }
}

任何解释它的帮助将不胜感激

4

2 回答 2

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

所以m &= a清除 的最高位m,从而确保它是正数,假设使用有符号整数的二进制补码编码。

于 2013-09-06T09:30:30.053 回答
4

<<是位移运算符 1L << 63导致将 1 向左移动 63 位或 1 后跟 63 0s

~我相信不是按位吗,所以这将适用于上述情况并导致 0 后跟 63 1s

&是按位和,它导致按位对两个操作数应用 and 操作

最终,这似乎将其过滤为 63 位数据,因为任何更高的位都将被清零,因为

之所以可以强制为正,是因为通常最高位(在您的情况下为#64)在大多数符号中用作符号位,而这段代码基本上只是0将其输出,因此强制它不是负数,即正数

于 2013-09-06T09:31:18.357 回答