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 如何计算cmd批处理中给定十六进制的二进制表示形式中的个数?_Batch File_Cmd_Binary_Hex_Counting - Fatal编程技术网

Batch file 如何计算cmd批处理中给定十六进制的二进制表示形式中的个数?

Batch file 如何计算cmd批处理中给定十六进制的二进制表示形式中的个数?,batch-file,cmd,binary,hex,counting,Batch File,Cmd,Binary,Hex,Counting,我正在尝试编写一个批处理文件,要求用户键入一个十六进制数字,然后在二进制表示中计算数字,就像我键入了一个程序echos 1一样 我有这个代码,它使用一个查找表从二进制转换为十六进制,答案是 我试图改变代码的工作方式,但没有成功 这是我的尝试 @echo off setlocal set "hex=ABCDEF" call :hex2bin bin=%bin% echo : %bin% pause; goto :EOF :hex2bin binVar=hexValue setlocal En

我正在尝试编写一个批处理文件,要求用户键入一个十六进制数字,然后在二进制表示中计算数字,就像我键入了一个程序echos 1一样

我有这个代码,它使用一个查找表从二进制转换为十六进制,答案是

我试图改变代码的工作方式,但没有成功

这是我的尝试

@echo off
setlocal

set "hex=ABCDEF"
call :hex2bin bin=%bin%
echo : %bin%
pause;
goto :EOF


:hex2bin binVar=hexValue
setlocal EnableDelayedExpansion

for %%a in (0-0000;1-0001;2-0010;3-0011;4-0100;5-0101;6-0110;7-0111;8-1000;9-1001;A-1010;B-1011;C-1100;D-1101;E-1110;F-1111) do (
   for /F "tokens=1,2 delims=-" %%b in ("%%a") do (
      set "bintable[%%b]=%%c"
   )
)

set "bin="
set "hex=000%~16"
:hex2binloop
   set "bin=!bintable[%hex:~-4%]!%bin%"
   set "hex=%hex:~0,-4%"
if defined hex if "%hex:~3%" neq "" goto hex2binloop
endlocal & set "%~4=%bin%"
goto :EOF

有人能帮我吗?

将数字转换成十进制,然后做基本的数学运算:除以2,然后对余数求和

因为批处理文件计算只支持31位(2^31-1或2147483647或0x7FFFFFFF),所以请以7个十六进制数字的块进行计算

输出:

五十一

@ECHO关闭
SETLOCAL
对于%%a IN(F37ABD abcdef 123 321 99 100 f11f 0咖啡馆),请拨打mainproc%%a
后藤:eof
:mainproc
设置hexnum=%1
设置/a计数1=0
:循环
集合/a hex1=0x%hexnum:~0,1%
:位循环
设置/a计数1+=%hex1%%%2
设置/a hex1/=2
如果%hex1%gtr 0转到位循环
设置hexnum=%hexnum:~1%
如果定义了hexnum GOTO循环
在%1中检测到回显%count1%1
后藤:EOF
for
循环只需依次将列表中的值分配给变量
%%a
,并使用该项的参数(
%1
)执行过程的主要部分

在主程序中,初始化
hexnum
作为要分析的数字,并用
1
的累积数初始化
count1

然后将前串的
hex1
设置为
0x
(复制
hexnum
的第一位数字),这将是一个十六进制数字,
0x0
设置为
0xf
。由于这是
cmd
接受十六进制数的格式,它将
hex1
设置为十进制0..15

接下来将(
hex1
mod 2)添加到
count
,如果是奇数/偶数,则为1或零

下一步减半
hex1
。由于
cmd
以整数模式计算,结果被截断,因此6=>3和7+>3

结果>0,执行下一个二进制数字。重复到0

扔掉hexnum的第一个字符(指定从字符1开始的子字符串,假设它从“字符0”开始计数)

如果
hexnum
还有字符,请重复下一个十六进制数字

否则,请报告

结果:

在F37ABD中检测到17个1s
在abcdef中检测到17 1s
在123中检测到4 1s
在321中检测到4 1s
在99中检测到4 1s
1在100中检测到1s
f11f中检测到10 1s
在0中检测到0 1s
在cafe中检测到11 1s


如果我理解正确,您不希望“将十六进制数转换为二进制数”,而是希望“计算每个十六进制数的位数”并将其累加(例如,对于一个数字,该数字为1)。这样,解决方案必须使用“每个十六进制数字的位数”


我觉得你只是在猜测。。。总之,快速浏览一下,我认为:1<代码>设置“十六进制=000%~16”应为
设置“十六进制=%~2”
;2. <代码>设置“bin=!bintable[%hex:~-4%]!%bin%”应为
设置“bin=!bintable[%hex:~-1%]!%bin%”
;3. <代码>设置“十六进制=%hex:~0,4%”应为
设置“十六进制=%hex:~0,1%”
;4.
如果定义
行应该是
如果定义了hex goto hex2binloop
;5.
endlocal
行应该是
endlocal&设置“%~1=%bin%”
;这真是个好主意,是的,你让我明白了:)非常感谢
@echo off
setlocal

set "hex=ABCDEF"
call :hex2bin bin=%bin%
echo : %bin%
pause;
goto :EOF


:hex2bin binVar=hexValue
setlocal EnableDelayedExpansion

for %%a in (0-0000;1-0001;2-0010;3-0011;4-0100;5-0101;6-0110;7-0111;8-1000;9-1001;A-1010;B-1011;C-1100;D-1101;E-1110;F-1111) do (
   for /F "tokens=1,2 delims=-" %%b in ("%%a") do (
      set "bintable[%%b]=%%c"
   )
)

set "bin="
set "hex=000%~16"
:hex2binloop
   set "bin=!bintable[%hex:~-4%]!%bin%"
   set "hex=%hex:~0,-4%"
if defined hex if "%hex:~3%" neq "" goto hex2binloop
endlocal & set "%~4=%bin%"
goto :EOF
set hex=ABCDEFABCDEFABCDEF

set ones=0
:loopchunks
    set /a decimal=0x%hex:~0,7%
    set hex=%hex:~7%
    :loopdigits
        set /a ones+=decimal %% 2, decimal/=2
        if not %decimal%==0 goto loopdigits
    if defined hex goto loopchunks

echo %ones%
@echo off
setlocal

set "hex=ABCDEF"
call :countOnesInHex ones=%hex%
echo There are %ones% ones in %hex%
pause
goto :EOF


:countOnesInHex ones=hexValue
setlocal

for %%a in (0-0;1-1;2-1;3-2;4-1;5-2;6-2;7-3;8-1;9-2;A-2;B-3;C-2;D-3;E-3;F-4) do (
   for /F "tokens=1,2 delims=-" %%b in ("%%a") do (
      set "onesIn[%%b]=%%c"
   )
)

set ones=0
set "hex=%~2"
:hexCountLoop
   set /A ones+=onesIn[%hex:~0,1%]
   set "hex=%hex:~1%"
if defined hex goto hexCountLoop
endlocal & set "%1=%ones%"
exit /B