这段代码有什么问题?二进制到十进制批处理

时间:2015-06-07 03:56:12

标签: batch-file cmd

我正在尝试批量编写二进制到十进制转换器以使用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 个答案:

答案 0 :(得分: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将其解释为 octal - base 8。

由于你的算法实际上并没有处理二进制数,所以它使用十进制数并且依赖于10的基数10和2的2的幂的方便相似性,将一些东西解释为八进制废弃它。

任何以0开头的数字都可能(可能)是错误的。

答案 1 :(得分: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感兴趣。

答案 2 :(得分: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,请将相应的潜力添加到两个。