c# - 理解这段代码 _num = (_num & ~(1L << 63));

标签 c# rngcryptoserviceprovider

谁能解释一下这段代码的作用:_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 后跟 63 0

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

&是按位与,它导致将与操作按位应用于两个操作数

最终这似乎是将它过滤成 63 位数据,因为任何更高的位都将由于和而被清零

之所以强制为正,是因为通常最高位(在您的情况下为#64)在大多数符号中用作符号位,并且此代码本质上只是0 s it out,从而迫使它不是负数,即正数

关于c# - 理解这段代码 _num = (_num & ~(1L << 63));,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18654386/

相关文章:

c# - 如何使用 RNGCryptoServiceProvider 生成桥牌?

c# - 需要在使用 TcpClient 的类上实现终结器?

c# - 如何用 'System.Security.Cryptography.AesManaged'加密一个byte[]?

c# - 从代码隐藏(或前端)设置 mailto

c# - 应用程序设置可靠吗?

c# - 为什么我的 C# 控制台应用程序在复制文件时因 'Out of Memory' 异常而崩溃?

c# - 如何使用 RNGCryptoServiceProvider 根据我喜欢的字符创建随 secret 码?

c# - 包含最小值和最大值的 RNGCryptoServiceProvider