C#中的连接整数

Cou*_*Cet 32 c#

有没有一种廉价的方法来连接csharp中的整数?

示例:1039和7056 = 10397056

Rex*_*x M 62

如果你能找到一个足以引起任何担忧的情况,我会非常感动:

int a = 1039;
int b = 7056;

int newNumber = int.Parse(a.ToString() + b.ToString())
Run Code Online (Sandbox Code Playgroud)

或者,如果你想让它更像".NET-ish":

int newNumber = Convert.ToInt32(string.Format("{0}{1}", a, b));
Run Code Online (Sandbox Code Playgroud)

int.Parse 不是一个昂贵的操作.花点时间担心网络I/O和O ^ N正则表达式.

其他注意事项:实例化StringBuilder的开销意味着如果你只进行一些连接就没有意义.而且很重要的是-如果你打算把这个回整,记住它的限制为约20亿.连接数非常快,并且可能远远超出32位int的容量.(当然签名).

  • @Brandon在技术上是正确的,但编译器在任何一种方式都进行相同的字符串转换,因此它最多只能节省几次击键. (6认同)
  • 您只需要在其中一个整数上调用.ToString(). (5认同)

P_P*_*P_P 12

我在派对上有点晚了,但最近我不得不连接整数.0 <a,b <10 ^ 9可以很快完成.

static ulong concat(uint a, uint b)
{
    if (b < 10U) return 10UL * a + b;
    if (b < 100U) return 100UL * a + b;
    if (b < 1000U) return 1000UL * a + b;
    if (b < 10000U) return 10000UL * a + b;
    if (b < 100000U) return 100000UL * a + b;
    if (b < 1000000U) return 1000000UL * a + b;
    if (b < 10000000U) return 10000000UL * a + b;
    if (b < 100000000U) return 100000000UL * a + b;
    return 1000000000UL * a + b;
}
Run Code Online (Sandbox Code Playgroud)

编辑:下面的版本可能很有趣(平台目标:x64).

static ulong concat(ulong a, uint b)
{
    const uint c0 = 10, c1 = 100, c2 = 1000, c3 = 10000, c4 = 100000,
        c5 = 1000000, c6 = 10000000, c7 = 100000000, c8 = 1000000000;
    a *= b < c0 ? c0 : b < c1 ? c1 : b < c2 ? c2 : b < c3 ? c3 :
         b < c4 ? c4 : b < c5 ? c5 : b < c6 ? c6 : b < c7 ? c7 : c8;
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是答案(op要求廉价的方式),我已经对这里的一些答案进行了基准测试,这个答案在36ms上排名第一(相对于546ms的接受答案,以及718ms的.NET-ish方式) .我通过生成一百万个随机整数来测试它们,最多20000(没有溢出),并将每个整数与前一个整数连接起来. (6认同)

Ski*_*izz 9

我认为你不能比这更简单:

static uint Concat (uint a, uint b)
{
  uint
    pow = 1;

  while (pow < b)
  {
    pow = ((pow << 2) + pow) << 1;
    a = ((a << 2) + a) << 1;
  }

  return a + b;
}
Run Code Online (Sandbox Code Playgroud)

没有内存分配,字符串转换或乘法; 或者可能:

static uint Concat (uint a, uint b)
{
  uint
    pow = 1;

  while (pow < b)
  {
    pow = ((pow << 2) + pow) << 1;
  }

  return a * pow + b;
}
Run Code Online (Sandbox Code Playgroud)

如果要连接两个二进制数:

static uint Concat (uint a, uint b)
{
  uint
    mask = uint.MaxValue;

  while ((mask & b) != 0)
  {
    mask <<= 1;
    a <<= 1;
  }

  return a | b;
}
Run Code Online (Sandbox Code Playgroud)

  • 无法获得任何_simpler_?我可以相信这是最快的方法,变化很聪明,但我不确定这个标签是否"简单".;) (8认同)

Tim*_*han 8

  1. string ConcatInt(int x,int y){return String.Format("{0}{1}",x,y);}
    
    Run Code Online (Sandbox Code Playgroud)
  2. int ConcatInt(int x,int y){
       return (x * Math.Pow(10, y.length)) + y;
    }
    
    Run Code Online (Sandbox Code Playgroud)

编辑注意:修复了一些错误类型.还剩下更多的类型问题.我只是给出答案的大纲

第二种方法实际应该是:

static int ConcatInt2(int x, int y) {
   return (int)(x * Math.Pow(10, y.ToString().Length)) + y;
}
Run Code Online (Sandbox Code Playgroud)


wha*_*ame 8

便宜?字符串连接或格式化字符串可能会快得多.

否则你可以这样做:

Math.Pow(10,Math.Ceiling(Math.Log10(second)))*first+second
Run Code Online (Sandbox Code Playgroud)

第一个和第二个是整数.这是你要做的唯一方法,不涉及转换为字符串和返回,但我非常怀疑它会更快.


jit*_*ter 6

如果要将多个int连接到String

StringBuilder sb = new StringBuilder(1039);
sb.Append(7056);
sb.Append(1234);
sb.Append(1235);
....
sb.Append(9999);
sb.ToString();
Run Code Online (Sandbox Code Playgroud)