把一个整数拆成 2 的N次方的和 ,当然这个整数是刚好可以拆的如:50=32+16+2
我所用的二个算法如下:
第一个:
Int64 sum=50;
Int64 p ;
int i=(int)(System.Math.Log((double)sum)/System.Math.Log(2));
for( ; i > 0 ; i--)
{
p = (Int64)System.Math.Pow(2,i);
if(sum >= p)
{
Int64 c=(Int64)System.Math.Pow((double)2,(double)i);
this.textBox1.Text += " ---->" + i.ToString() ;
sum -= p;
}
}
第二个:
Int64 i=50;
int b=0;
Int64 a;
do
{
a=i&1;
if(a==1)
{
textBox1.Text+="--->"+b.ToString();
}
i=i>>1;
b++;
}while(i!=0);
这两个算法的效率还能不能再优化,请高手指点,还有第一个的算法要比第二个快也请高手指点移位为什么函数要慢呢?只是慢一点点
我所用的二个算法如下:
第一个:
Int64 sum=50;
Int64 p ;
int i=(int)(System.Math.Log((double)sum)/System.Math.Log(2));
for( ; i > 0 ; i--)
{
p = (Int64)System.Math.Pow(2,i);
if(sum >= p)
{
Int64 c=(Int64)System.Math.Pow((double)2,(double)i);
this.textBox1.Text += " ---->" + i.ToString() ;
sum -= p;
}
}
第二个:
Int64 i=50;
int b=0;
Int64 a;
do
{
a=i&1;
if(a==1)
{
textBox1.Text+="--->"+b.ToString();
}
i=i>>1;
b++;
}while(i!=0);
这两个算法的效率还能不能再优化,请高手指点,还有第一个的算法要比第二个快也请高手指点移位为什么函数要慢呢?只是慢一点点
解决方案 »
- 大家帮忙看看这个编码问题的转换怎么搞。谢谢
- TreeNode.Tag是什么意思?
- 求助,Win7系统下c#播放MP3的问题
- C#中创建iis 虚拟目录遇到难题(未处理COMException 当文件已存在时,无法创建该文件。异常来自HRESULT:0x800700B7)请大大来帮忙诊断下
- NET如何连接应用程序!
- nhibernate里怎么映射一个没有主键的表
- RSACryptoServiceProvider 使用证书私钥解密异常:不正确的项
- 急需做一个Web在线客服通讯的系统,希望高人指点!!!!!!
- 文件大小~!~!Fuck you~!
- 找.NET母版页模板
- 弱弱的问:怎么编译C#程序?
- 如何用C#读取XLS文件的工作簿名字?英文时可以读,但中文就无法读,取到是空的
while ( mask > 0 )
{
Console.Write( i & mask );
mask <<= 1;
}
其中i是你输入的整数。public string getshu(long i)
{
string ss=Convert.ToString(i,2);
int k=ss.Length;
string st="";
for(int j=0;j<k;j++)
{
if(ss[j]=='1')st+=Math.Pow(2,k-j-1).ToString()+"+";
}
return i.ToString()+"="+st.Substring(0,st.Length-1);
}
long i = 50;
long mask = 1;
long cur=0;
while ( mask > 0 )
{
cur=mask&i;
if(cur>0)
Console.Write(cur+" ");
mask <<= 1;
}
long i = 50; long mask = 1;
while (mask <i)
{
if ((i & mask)!=0)
{
Console.WriteLine(i & mask);
}
mask <<= 1;
}Ivony(),STRONG
{
String tmp="";
if (i!=0){
tmp+=getBinstr(i/2);
if (i%2==0) tmp+="0"; else tmp+="1";
}
return tmp;
}
long i = 50;
long mask = 1;
long cur=0;
while ( mask > 0 )
{
cur=mask&i;
if(cur>0)
Console.Write(cur+" ");
mask <<= 1;
}=======================================这个是故意不这样写的,因为不确定输出是什么,比如说,我自己做了一个输出,类似于这样public void Output( int i )
{
...
}
我就可以直接在这里拦截:
public void Output( int i )
{
if ( i == 0 ) return; ...
}不过后来想想,函数调用一次也存在一次拷贝操作,而且花费也颇大,所以还是直接在代码中拦截也许更好。数值越大,这个算法效率越高……
因为它就是弄一位二进制不断左移把所有的二进制位输出的。
如果是C++,那么就有更极端的写法了,呵呵……
{
if ( i & mask == 0 )
continue;
Console.Write( mask + " " );
}简洁,高效……
一直到mask=-9223372036854775808。。没错是超过long的范围的时候。。如果加上条件mask<=i就不用循环那么多次了。。
{
if ( i & mask == 0 )
continue;
Console.Write( mask + " " );
}