2015-12-17 34 views
1

我试图将大约33'000'000十进制数转换为二进制。 目前我与这个脚本工作:快速转换十进制到二进制数 - Powershell

$top = 33000000000 
$binary 
$out 
$cache 
for($i = 0; $i -lt $top; $i++){ 
$binary = [Convert]::ToString($i, 2) 
$cache = $binary 
$out = 10000000000000000000000000 + $cache 
Write-Host $out 
$out | Out-File -FilePath C:\Users\inffhe\Desktop\binary\binary.txt -Append 
} 
Read-Host 

那么它的工作原理,但它远远慢... 有了这样的速度,这将是直行约5天。 你有什么想法如何使得更快? 我在数字中加了“10000000000000000000000000”,因为它需要有25位数字。 感谢您的努力。

+0

注意不是[INT] –

回答

2
  1. 删除任何控制台输出,例如, Write-Host
  2. $out = 10000000000000000000000000 + $cache隐式地将您的二进制字符串转换回整数(或者甚至可以是double)以执行加法。确保你的号码最初设置了第25位,例如与$i -bor 0x100000
  3. 使用不同的语言。 C#可能会比PowerShell具有更低的可读性和更快的方式。

在我的机器在这里下面的片段在一个位执行在7秒时:

0..100000|%{[Convert]::ToString(($_-bor0x1000000), 2)}|out-file x.txt 

这意味着全数字3300将约40分钟的地方。

在另一方面,下面的C#

using System; 
using System.IO; 

class X{ 
    static void Main() { 
    using (var f = new StreamWriter(File.OpenWrite("x.txt"))) { 
    for (int i=0;i<33000000;i++) { 
     f.WriteLine(Convert.ToString(i | 0x100000, 2)); 
    } 
    } 
    } 
} 

执行短短的几秒钟。所有33000000号码。生成一个820 MiB文件。

+1

好建议,虽然C#未必要快得多这取决于正在使用[十进制]的方法(尤其如此在v3 +)。如果需要PowerShell,但只有C#的性能足够好,那么也可以使用“Add-Type”嵌入C#。 – briantist

+1

@briantist,当然,'Add-Type'是一个选项。虽然我通常只需编写一个简短的C#文件并通过csc运行它,但速度更快。大多数情况下,编辑PowerShell字符串中的C#代码也有点尴尬。而对于像循环这样的事情,C#比*方式更快,因为它没有被解释。不过,他们的主要问题很可能是从'int'到'string',再到'int',然后再到'string'。这种事情从来都不是很快。 – Joey

+0

谢谢你的想法。 C#版本效果很好 – Elanduir

2

这一点完成了超过一分钟:

filter convert {[convert]::ToString($_,2)} 
$pad = [convert]::ToInt32('10000000000000000000000000',2) 
$top = 33e6 
($pad..($top + $pad)) | convert