Batch file 如何计算cmd批处理中给定十六进制的二进制表示形式中的个数?
我正在尝试编写一个批处理文件,要求用户键入一个十六进制数字,然后在二进制表示中计算数字,就像我键入了一个程序echos 1一样 我有这个代码,它使用一个查找表从二进制转换为十六进制,答案是 我试图改变代码的工作方式,但没有成功 这是我的尝试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
@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