コード例 #1
0
        /// <summary>
        /// 返回指定整数二进制表示的下一字典序排列。
        /// </summary>
        /// <param name="value">要获取下一字典序排列的整数。</param>
        /// <returns>指定整数二进制表示的下一字典序排列。</returns>
        /// <remarks>
        /// <para>方法的返回值与 <paramref name="value"/> 的二进制表示包含相同个数的 <c>1</c>,
        /// 而且是字典序的下一排列。</para>
        /// <para>例如,<c>102</c> 的二进制表示为 <c>1100110</c>,它的下一字典序排列为
        /// <c>1101001</c>,同样包含 <c>4</c> 个 <c>1</c>,而相应的值为 <c>105</c>。
        /// <c>105</c> 的下一字典序排列为 <c>106</c>(二进制为 <c>1101010</c>),
        /// 接下来是 <c>108</c>(二进制为 <c>1101100</c>)和 <c>113</c>(二进制为 <c>1110001</c>)。
        /// </para></remarks>
        //[CLSCompliant(false)]
        public static ulong NextBitPermutation(this ulong value)
        {
            ulong t = value | (value - 1);

            return((t + 1UL) | (((~t & (ulong)(-(long)~t)) - 1UL) >> (value.CountTrailingZeroBits() + 1)));
        }