2015-06-07 59 views
1

我正在嘗試編寫一個二進制到十進制轉換器批量處理CMD。我有一個問題,一些二進制數給了我一個更高的十進制數比它應該。儘管我感到困惑的是,11111111給了我255.
下面是給出的錯誤數字的一些例子。
01110101給了297
01111010給了312
01111101給數321這段代碼有什麼問題?二進制到十進制批處理

@Echo off 
Color 0e 

:Start 
Title Binary to Decimal 
Set /p Bin=Binary Number? 
Set Dec=0 

:Check 
If %Bin% GEQ 10000000 Goto ADD128 
If %Bin% GEQ 1000000 Goto ADD64 
If %Bin% GEQ 100000 Goto ADD32 
If %Bin% GEQ 10000 Goto ADD16 
If %Bin% GEQ 1000 Goto ADD8 
If %Bin% GEQ 100 Goto ADD4 
If %Bin% GEQ 10 Goto ADD2 
If %Bin% GEQ 1 Goto ADD1 
Goto Fin 

:ADD128 
Set /a Dec= %Dec% + 128 
Set /a Bin= %Bin% - 10000000 
Goto Check 

:ADD64 
Set /a Dec= %Dec% + 64 
Set /a Bin= %Bin% - 1000000 
Goto Check 

:ADD32 
Set /a Dec= %Dec% + 32 
Set /a Bin= %Bin% - 100000 
Goto Check 

:ADD16 
Set /a Dec= %Dec% + 16 
Set /a Bin= %Bin% - 10000 
Goto Check 

:ADD8 
Set /a Dec= %Dec% + 8 
Set /a Bin= %Bin% - 1000 
Goto Check 

:ADD4 
Set /a Dec= %Dec% + 4 
Set /a Bin= %Bin% - 100 
Goto Check 

:ADD2 
Set /a Dec= %Dec% + 2 
Set /a Bin= %Bin% - 10 
Goto Check 

:ADD1 
Set /a Dec= %Dec% + 1 
Set /a Bin= %Bin% - 1 
Goto Check 

:Fin 
Echo %Dec% 
Pause 
Goto Start 
+3

編輯您的帖子以添加一些錯誤轉換的示例 - 不要讓我們猜測。 – Magoo

回答

2

這是有趣的數數,這不是我所期待的。

編輯您的代碼,以便每個添加來電顯示你它正在做什麼,如:

:ADD128 
echo (Bin: %Bin%) (Dec: %Dec%) Adding 128 
Set /a Dec= %Dec% + 128 
Set /a Bin= %Bin% - 10000000 
Goto Check 

01111010做到這一點:

Binary Number?01111010 
(Bin: 01111010) (Dec: 0) Adding 32 
(Bin: 199528) (Dec: 32) Adding 32 
(Bin: 99528) (Dec: 64) Adding 16 
(Bin: 89528) (Dec: 80) Adding 16 
(Bin: 79528) (Dec: 96) Adding 16 
(Bin: 69528) (Dec: 112) Adding 16 
(Bin: 59528) (Dec: 128) Adding 16 
(Bin: 49528) (Dec: 144) Adding 16 
(Bin: 39528) (Dec: 160) Adding 16 
(Bin: 29528) (Dec: 176) Adding 16 
(Bin: 19528) (Dec: 192) Adding 16 
(Bin: 9528) (Dec: 208) Adding 8 
(Bin: 8528) (Dec: 216) Adding 8 
(Bin: 7528) (Dec: 224) Adding 8 
(Bin: 6528) (Dec: 232) Adding 8 
(Bin: 5528) (Dec: 240) Adding 8 
(Bin: 4528) (Dec: 248) Adding 8 
(Bin: 3528) (Dec: 256) Adding 8 
(Bin: 2528) (Dec: 264) Adding 8 
(Bin: 1528) (Dec: 272) Adding 8 
(Bin: 528) (Dec: 280) Adding 4 
(Bin: 428) (Dec: 284) Adding 4 
(Bin: 328) (Dec: 288) Adding 4 
(Bin: 228) (Dec: 292) Adding 4 
(Bin: 128) (Dec: 296) Adding 4 
(Bin: 28) (Dec: 300) Adding 2 
(Bin: 18) (Dec: 302) Adding 2 
(Bin: 8) (Dec: 304) Adding 1 
(Bin: 7) (Dec: 305) Adding 1 
(Bin: 6) (Dec: 306) Adding 1 
(Bin: 5) (Dec: 307) Adding 1 
(Bin: 4) (Dec: 308) Adding 1 
(Bin: 3) (Dec: 309) Adding 1 
(Bin: 2) (Dec: 310) Adding 1 
(Bin: 1) (Dec: 311) Adding 1 
312 

因爲它以0開始,在命令提示符ifset將其解釋爲八進制 - 基數8.

因爲你的算法實際上並沒有使用二進制數字,所以它使用的是基數爲10的數字,並且依賴於10個基本10個冪和2個2個基本冪的方便相似性,將某些事物解釋爲八進制。

任何以0開頭的數字(可能)都是錯誤的。

+0

非常感謝你,我不知道領先的0是八進制。 – dylful

+0

+1,因爲這正好回答了這個問題(「這個代碼有什麼問題?」),沒有任何提示,如何解決它;) – Stephan

1

與邏輯和數學的一點點,就可以大大縮短你的代碼:

@Echo off 
setlocal enabledelayedexpansion 
Color 0e 

:Start 
Title Binary to Decimal 
Set /p Bin=Binary Number? 
Set Dec=0 
set pot=1 

:Check 
for /L %%i in (7,-1,0) do (
    if "!Bin:~%%i,1!" == "1" set /a dec +=!pot! 
    REM echo Stelle:%%i Potenz:!pot! Binary:!Bin:~%%i,1! Decimal:!dec! 
    set /a pot*=2 
) 

:Fin 
Echo %bin% = %Dec% 
Pause 
Goto Start 

訣竅:看從右到左的單號,如果它是1,則根據潛在能力增加二。

+1

我想出瞭如何刪除前導0並將我的原始代碼縮短爲14行。這是一個很好的例子,雖然謝謝。 – dylful

2

我知道這不是你要求的,但這是我會做這種轉換(最多31個二進制數字)的方式。

編輯:我稍微修改了代碼,以便它現在可以轉換一個32位有符號數。

@Echo off 
setlocal EnableDelayedExpansion 

Color 0e 
Title Binary to Decimal 

:Start 
Set /p Bin=Binary Number? 
Set Dec=0 
for /L %%i in (1,1,32) do if defined Bin (
    set /A "Dec=(Dec<<1)|!Bin:~0,1!" 
    set "Bin=!Bin:~1!" 
) 
Echo %Dec% 
Pause 
Goto Start 

也許你可能會對this post感興趣。

+0

有趣......我用'<<'運算符試過但沒有成功。它似乎需要報價。另一方面,我的德語'set /?'聲稱,二進制值有一個前綴'0b'(這不起作用),所以我沒有花太多時間進行調查。 – Stephan

相關問題