C# 在C中拆分一个6位整数#

C# 在C中拆分一个6位整数#,c#,.net,C#,.net,我有一个6位数的整数,比如说“153060”,我想分成两部分 int a=15(前2位) int b=30(第二个2位数) int c=60(第三个2位数) 首先想到的是将int转换为字符串,使用子字符串(或变体)将其拆分,然后再转换回int 但这似乎是一种效率极低的方法。有人能推荐一种更好/更快的方法来解决这个问题吗 谢谢 其他信息:拆分int的原因是因为6位整数表示HHMMSS,我想用它创建一个新的DateTime实例: DateTime myDateTime=新的日期时间(年、月、日、a、

我有一个6位数的整数,比如说“153060”,我想分成两部分

int a=15(前2位)

int b=30(第二个2位数)

int c=60(第三个2位数)

首先想到的是将int转换为字符串,使用子字符串(或变体)将其拆分,然后再转换回int

但这似乎是一种效率极低的方法。有人能推荐一种更好/更快的方法来解决这个问题吗

谢谢

其他信息:拆分int的原因是因为6位整数表示HHMMSS,我想用它创建一个新的DateTime实例:

DateTime myDateTime=新的日期时间(年、月、日、a、b、c)


但是,用户字段只能接受整数。

您可以在不转换为字符串的情况下使用:

int y = number / 10000;
int m = (number - y*10000) / 100;
in d = number % 100;
int a = 153060 / 10000;
int b = (153060 / 100) % 100;
int c = 153060 % 100;

我不确定与转换为字符串相比,效率有多高。我想这只是4次手术。所以它可能更快。

像这样的东西怎么样

int i = 153060;

int a = i / 10000;
int b = (i - (a * 10000)) / 100;
int c = (i - ((a * 10000) + (b * 100)));

如果您的最终目标是
DateTime
,则可以使用从字符串中提取
TimeSpan
,然后将其添加到
DateTime

TimeSpan time = TimeSpan.ParseExact(time, "hhmmss", CultureInfo.InvariantCulture);
DateTime myDateTime = new DateTime(2011, 11, 2);
myDateTime = myDateTime.Add(time);

(假设>=.NET 4)

如果时间不是字符串,那么首先为什么要使用base-10表示法存储时间?过早优化是万恶之源。如果这将成为批量处理的一部分,则只需担心效率。e、 每秒发生数千次。否则,您描述的算法就可以了。(尽量避免过早优化,尽管在这种情况下,算法是/应该本地化的。)您还可以尝试
DateTime.ParseExact(number.ToString(),“HHmmss”)
,这样您就不需要
SubString()
您需要
int m=(number-(y*10000))/100编辑:在我指出它之前就抓到了+1用于避免模量,这与subtraction@Cameron:如果您打算在该级别进行优化(这不太可能有用),您应该完全删除分区。@Joren:哈,是的,这是一个很好的观点(尽管我看不到在这种特殊情况下删除分区的方法)。如果出于某种奇怪的原因确实需要最终的微观优化,那么首先将输入按位进行分区无疑会更快,因此只需要移位和掩码。@Cameron:已知常数的除法可以用加法、移位和乘法的组合来代替。我不确定JIT与这个进程有多远,但我知道一个优化的C++编译器会做一些疯狂的事情。作为伪代码示例,uint64 y=x;y*=0x11111111;y+=x>>3;y>>=34;返回(uint32)y;如果x也是一个无符号的32位整数,则返回x/60。@Cameron:不管怎样,我的观点是,我只写模,因为这是我最明显想要完成的。如果结果不是足够快,那么我会考虑做一个不太明显的方式。是的,但是只有在.NET 4中出现。嗨,安得烈,我收到了错误信息。System.TimeSpan不包含“ParseExact”的定义。啊,这可以解释:)是的。您可以使用
DateTime.ParseExact
做一些事情,但它可能不会像使用
TimeSpan
那样优雅:(