可以解释这段代码的作用:_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;
}
}
任何帮助解释它将不胜感激
<<
是位移位运算符1L << 63
将 1 左移 63 位或 1 后跟 630
s 的结果
~
是我相信按位不是,所以这将适用于上述,并导致 0 后跟 631
s
&
是按位的,它导致将和运算按位应用于两个操作数
最终,这似乎将其过滤为 63 位数据,因为任何更高的位都将由于和
这工作强制为正的原因是因为通常最高位(在您的情况下为 # 64)在大多数符号中用作符号位,并且此代码本质上只是0
,因此强制它不是负的,即正的
a = ~(1L << 63) = ~0x1000000000000000 = 0x7fffffffffffffff
所以m &= a
清除m
的最高位,从而确保它是正的,假设使用有符号整数的two's complement编码。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(29条)