呵呵。求一个函数。我有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等了。用位运算效率高一些。谢谢了。
我想找出这些数中以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等了。用位运算效率高一些。谢谢了。
解决方案 »
- 用自己编写的控件如何让生成的exe脱离dll的依赖?
- 求救:关于窗口关闭、打开的问题
- C# 如何不用关闭程序,清除Webbrowser的Cookies
- 对程序的打包问题
- FastReport.Net保存流问题
- 多个线程,使用不同的参数来调用同一个函数是否会导致结果数据乱套?
- c#菜鸟提问,请多多指教
- 读取数据库内存储的时间段内的数据
- 这个Idea如何实现?一个方便用户输入的问题!
- 请教C#与VB.Net的区别
- 如何用代码来实现“通过代理服务器来上网”?
- 我买了一个日立320G新移动硬盘,图美外壳,我的机器是联想1G AMD cpu,1G内存,我往移动硬盘上复制90G的文件花了88分钟时间,太慢,有什么办法让复制文件的速度加快一点。大量复制、删除文件拷机新移动硬盘。
2.有个假设,就是两个2的方次之和,不会等于更高次方的结果
就是 2的X方+2的Y方不会等于2的Z方(X+Y<Z,X!=Y)
3.基于以上思路得出,如果这个数的值就是2的方次的话,那它就只包含一个1。反之则表示包含多个1
(用程序递归验证了一部分数,跑到计算机都受不了的程度,相信范围够了吧。)不是数学家,没法用理论证明了。呵呵
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] ;//这个就是最终结果。
}
比如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进制.求一个思路也行.
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;
}
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 );
}
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}
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);
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);
}
}
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就是有且只有一个的状态
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;
}
测试过,可行!
6楼的说实话我真没看太明白,可能是时间不够,没静心去读,先谢了.
gomoku 第2个代码可以,但是只找到l,不能标出是第几位,我再自己修改一下.
10楼和17楼linq的应该比较简单,但是我这次05环境暂时用不了,先copy下来备用.
其他几个朋友的正在测试中,再次感谢!