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

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;
        }


    }
}
posted @ 2011-07-05 01:15  CSDN大笨狼  阅读(342)  评论(1编辑  收藏  举报