呵呵。求一个函数。我有N个long型数 (N=10吧),每个数都是二进制M位的(M也=10吧),编程不用考虑NM了。
我想找出这些数中以2进制表示时,某位只有1个是1的那个数。
比如 举个简单例子
n[0]=0x 0001;
n[1]=0x 0101;
n[2]=0x 0010;
n[3]=0x 1100;结果就是第0位有2个数为1(n0,n1),不要。
第1为有1个数为1 (n2),需要。
第2位有2个数为1(n1,n3),不要。
第3位有1个数为1 (n3),需要。只需要输出满足要求的 位数和N几 就行,有1对算1对。
就这样,不知描述的大家是否能看明白。呵呵
请不要将long再转string,char等了。用位运算效率高一些。谢谢了。

解决方案 »

  1.   

    1.首先,二进制的值是将每位用0或1乘2的n-1次方
    2.有个假设,就是两个2的方次之和,不会等于更高次方的结果
      就是 2的X方+2的Y方不会等于2的Z方(X+Y<Z,X!=Y)
    3.基于以上思路得出,如果这个数的值就是2的方次的话,那它就只包含一个1。反之则表示包含多个1
    (用程序递归验证了一部分数,跑到计算机都受不了的程度,相信范围够了吧。)不是数学家,没法用理论证明了。呵呵
      

  2.   

    我给lz写个思路,lz自己写函数吧
    long[ ] myData;//存放那N个数
    bool [ ] myBool;//定义成N个元素。大小为N
    bool [ ] myResult;//存放最总结果。大小也为N
    int Flag;
    int Total;for(int i=0;i<=M-1;i++) //假设是M位二进制,i代表从第0位到第M-1位。
    {
          Flag=2的i次幂;//此处Flag是2的i次幂,i=0,flag=1,i=3,Flag=2*2*2
          Total=0;//把Total设置为0
          myBool的值都设置为False;//每次都把myBool的值赋值为False
          For(int j=0 ; j<=N-1;j++)
          {
               if((myData[j] & flag)==1)
                     {
                         Total+=1;
                         myBool[j]=True;
                     }
          }
          if(Total =1)
              {
                  找到myBool中为True的下标;
                  把myResult中同下标赋值为True;
             }
         else if(Total>=2)
            {
                  找到myBool中为True的下标;
                  把myResult中同下标赋值为False;
           }
    }for(int i=0; i<=N-1;i++)
    {
        if(myResult[i]==true)
             输出 myData[i] ;//这个就是最终结果。
    }
      

  3.   

    天啊,大家理解的和我说的不太一样?我一急语言也变差了。嘿嘿。把抽象的例子转为一个现实说法吧。
    比如N=4个人,有M=4项技能,(英语,日语,德语,法语)。其会就用1表示,不会用0表示。
    n[0]=0x 0001; 表示此人会法语。
    n[1]=0x 0101; 表示此人会日语,法语
    n[2]=0x 0010; 表示此人会德语
    n[3]=0x 1100; 表示此人会英语,日语我现在想找某种语言有且只有一个人会的。输出结果为语言和那个人。
    结果为: 德语-n[2] ; 英语-n[3]就是16进制.求一个思路也行.
      

  4.   


            static void Main(string[] args)
            {
                long[] array = { 11, 222, 3333, 44444 };
                Array.Sort(array);
                int times = Convert.ToString(array[array.Length - 1], 2).Length;
                for (int i = 0; i < times; i++)
                {
                    int zeros = 0;
                    int index = -1;
                    for (int j = 0; j < array.Length; j++)
                    {
                        if (GetRightDigit(array[j], out array[j]) == 1)
                        {
                            index = j;
                            zeros++;
                        }
                    }
                    if (zeros == 1)
                        Console.WriteLine("第{0}位只有一个1的数组元素索引:{1}", i, index);
                }            #endregion        }        public static int GetRightDigit(long i, out long j)
            {
                if (i == 0)
                {
                    j = 0;
                    return 0;
                }
                if (i == 1)
                {
                    j = 0;
                    return 1;
                }
                j = i >> 1;
                return (int)i % 2;
            }
      

  5.   

    int[] numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    const int M = 4;
    for( int b = 0; b < M; b++ )
    {
        if( ( from n in numbers where ( ( n >> b ) & 1 ) == 1 select n ).Count() == 1 )
            Console.WriteLine( "第{0}位只有一个bit为1", b );
    }
      

  6.   


        long[] N = { 1, 5, 2, 12 };
        long mask = 0;    foreach (long l in N)
        {
            mask ^= l;
        }    List<long> results = new List<long>();
        foreach (long l in N)
        {
            if ((mask & l) != 0)
            {
                results.Add(l);
            }
        }    //results = {2, 12}
      

  7.   


    public class 技能
        {
            public void Get(Language[] lang)
            {
               int[] n = new int[4];
               n[0] = 1; //0x 0001表示此人会法语。 
                n[1] = 5; //0x 0101表示此人会日语,法语 
                n[2] = 2; //0x 0010表示此人会德语 
                n[3] = 12; //0x 1100表示此人会英语,日语             int langSum = 0;
                string langDesrip = String.Empty;            for (int j = 0; j < lang.Length; j++)
                {
                    langSum += Convert.ToInt32(lang[j].Item);
                    langDesrip += lang[j].Item.ToString() + "   ";
                }            for (int i = 0; i < n.Length; i++)
                {
                    int userSkill = n[i];
                    if (userSkill == langSum)
                    {                    Console.WriteLine("技能" + langDesrip + "用户n[" + i.ToString() + "]掌握了");
                    }
                }
            }
        }
        public enum LanguageItem
        {
            //英语,日语,德语,法语
            French = 1,
            GerMany = 2,
            Japanese = 4,
            English = 8
        }    public class Language
        {
            LanguageItem item;        public LanguageItem Item
            {
                get { return item; }
            }
            public Language(LanguageItem item)
            {
                this.item = item;
            }
        }
    下面是调用部分:
                    技能 a = new 技能();                Language l1 = new Language(LanguageItem.GerMany);
                    Language l2 = new Language(LanguageItem.Japanese);                Language[] lang = new Language[] { l1,l2 };
                    a.Get(lang);
        
      

  8.   

        long[] N = { 1, 5, 2, 12, 2, 2 };    long gen1 = 0;             // 有过一个1的
        long gen2 = 0;             // 超过一个1的    foreach (long l in N)
        {
            gen2 |= (gen1 & l);
            gen1 |= l;
        }    long mask = gen1 & (~gen2);
        List<long> results = new List<long>();
        foreach (long l in N)
        {
            if ((mask & l) != 0)
            {
                results.Add(l);
            }
        }
      

  9.   

      linq 的
    long[] s = new long[] { 0x0001, 0x0101, 0x0010, 0x1100, 0x0011 };
                long y1 = 0x0001;
                long y2 = 0x0010;
                long y3 = 0x0100;
                long y4 = 0x1000;
                long mask = 0x1111;
          var res = s.Where(c => ((c ^ mask) & y2) == 0);这个res就是你要东西,res.count=1就是有且只有一个的状态
      

  10.   

    int[] array={1,5,2,12};//数据长度可任意扩展
    int temp=0,count=0;
    for(int i=0;i<10;i++)//假设M的值为10
    {
    for(int j=0;j<array.Length;j++)
    {
    if(((int)Math.Pow(2,i)&array[j])>0)
    {
    temp=array[j];
    count++;
    }
    if(count>1)
    {
    count=0;
    break;
    }
    }
    if(count==1)
    {
    this.textBox2.Text+="第"+i+"位为1的数只有:"+temp+"\r\n";
    count=0;
    }
    测试过,可行!
      

  11.   

    多谢各位.
    6楼的说实话我真没看太明白,可能是时间不够,没静心去读,先谢了.
    gomoku 第2个代码可以,但是只找到l,不能标出是第几位,我再自己修改一下.
    10楼和17楼linq的应该比较简单,但是我这次05环境暂时用不了,先copy下来备用.
    其他几个朋友的正在测试中,再次感谢!