Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 这个代码有什么问题?二进制到十进制批处理_Batch File_Cmd - Fatal编程技术网

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

Batch file 这个代码有什么问题?二进制到十进制批处理,batch-file,cmd,Batch File,Cmd,我正在尝试批量编写一个二进制到十进制的转换器来使用CMD。我遇到了一个问题,一些二进制数给我的十进制数比它应该给的要高。但让我困惑的是11111给了我255个。 以下是一些错误数字的示例。 01110101给出了号码297。 01111010给出了312号。 0111101给出了号码321 @Echo off Color 0e :Start Title Binary to Decimal Set /p Bin=Binary Number? Set Dec=0 :Check If %Bin%

我正在尝试批量编写一个二进制到十进制的转换器来使用CMD。我遇到了一个问题,一些二进制数给我的十进制数比它应该给的要高。但让我困惑的是11111给了我255个。
以下是一些错误数字的示例。
01110101给出了号码297。
01111010给出了312号。
0111101给出了号码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

那很有趣,这不是我所期望的

编辑您的代码,以便每个添加调用都显示它正在执行的操作,例如:

: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开头,所以命令提示符
if
set
将其解释为八进制8

因为你的算法实际上不是在处理二进制数,它是在处理以十为基数的数字,并且依赖于以十为基数的十次幂和以二为基数的二次幂的方便的相似性,将一些事情解释为八进制破坏了它


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

这很有趣,这不是我所期望的

编辑您的代码,以便每个添加调用都显示它正在执行的操作,例如:

: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开头,所以命令提示符
if
set
将其解释为八进制8

因为你的算法实际上不是在处理二进制数,它是在处理以十为基数的数字,并且依赖于以十为基数的十次幂和以二为基数的二次幂的方便的相似性,将一些事情解释为八进制破坏了它


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

通过一点逻辑和数学,您可以大大缩短代码:

@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
,则将相应的效价添加到2。

通过一点逻辑和数学,您可以大大缩短代码:

@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
,则将相应的效价添加到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
@Echo关闭
setlocal EnableDelayedExpansion
颜色0e
标题从二进制到十进制
:开始
Set/p Bin=二进制数?
设置Dec=0
对于(1,1,32)中的/L%%i,如果定义了Bin,则执行(

set/A“Dec=(Dec我知道这不是您要求的,但这是我进行这种转换的方式(最多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
@Echo关闭
setlocal EnableDelayedExpansion
颜色0e
标题从二进制到十进制
:开始
Set/p Bin=二进制数?
设置Dec=0
对于(1,1,32)中的/L%%i,如果定义了Bin,则执行(

设置/A“Dec=(编辑您的帖子以添加一些不正确转换的示例-不要让我们猜测。编辑您的帖子以添加一些不正确转换的示例-不要让我们猜测。非常感谢您,我不知道前导0将其设置为八进制。+1,因为这正好回答了问题(“此代码有什么问题?”)没有任何提示,如何解决;)非常感谢你,我不知道它是一个八进制。+1,因为这正好回答了问题(“这个代码怎么了?”)没有任何提示,如何解决;)我知道了如何删除前导0并将原始代码缩短为14行。这是一个很好的示例,说明了如何删除前导0,并将原始代码缩短为14行。这是一个很好的示例,说明了如何删除前导0。谢谢。很有趣…我尝试了
有趣…我尝试了t他