二进制超大整数的秒杀速配

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Numerics;

using System.Globalization;

using System.Diagnostics;

namespace ConsoleApplication11

{

    class Program

    {

        static int[] HowMuch1 = new int[] {  0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,

2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,

2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,

4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,

2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,

3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,

4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};

        static void Main(string[] args)

        {

            Stopwatch SW = new Stopwatch();



            SW.Start();

            BigInteger B = new BigInteger(234235436457658);

            BigInteger A = (BigInteger.One << 3999) + B;



            Tuple<int, int> Sim = MatchDegree(A, B);

            SW.Stop();

            Console.WriteLine("相同数" + Sim.Item1);

            Console.WriteLine("总数" + B.ToByteArray().Length * 8);

            Console.WriteLine("偏移量" + Sim.Item2);



            Console.WriteLine("毫秒数" + SW.ElapsedMilliseconds);

            Console.Read();

        }

        public static Tuple<int, int> MatchDegree(BigInteger A, BigInteger B)

        {

            Tuple<int, int> max = new Tuple<int, int>(0, 0);

            int a = A.ToByteArray().Length;

            B = B << a;

            int offset = 0;

            while (B > BigInteger.One)

            {

                B >>= 1;

                offset++;

                int count = MatchDegree(~(A ^ B));

                if (count > max.Item1) { max = new Tuple<int, int>(count, offset); }

            }

            return max;

        }

        public static int MatchDegree(BigInteger A)

        {

            byte[] b = A.ToByteArray();

            int count = 0;

            for (int i = 0; i < b.Length; i++)

            {

                count += HowMuch1[b[i]];

            }

            return count;

        }







        //判断一个ulong数字里有几个1        

        public static int MatchDegree(ulong u) { u = (u & 0x5555555555555555) + ((u >> 1) & 0x5555555555555555); u = (u & 0x3333333333333333) + ((u >> 2) & 0x3333333333333333); u = (u & 0x0F0F0F0F0F0F0F0F) + ((u >> 4) & 0x0F0F0F0F0F0F0F0F); u = (u & 0x00FF00FF00FF00FF) + ((u >> 8) & 0x00FF00FF00FF00FF); u = (u & 0x0000FFFF0000FFFF) + ((u >> 16) & 0x0000FFFF0000FFFF); u = (u & 0x00000000FFFFFFFF) + ((u >> 32) & 0x00000000FFFFFFFF); return Convert.ToInt32(u); }

        private static string DisplayInBinary(BigInteger number)

        {

            byte[] bytes = number.ToByteArray();

            string binaryString = string.Empty;

            foreach (byte byteValue in bytes)

            {

                string byteString = Convert.ToString(byteValue, 2).Trim();

                binaryString += byteString.Insert(0, new string('0', 8 - byteString.Length));

            }

            return binaryString;

        }





    }

}

你可能感兴趣的:(二进制)