2015-12-17 33 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