如何计算 cmd 批处理中给定十六进制的二进制表示形式?
How to count the ones in a binary representation of a given hex in a cmd Batch?
我正在尝试编写一个批处理文件,要求用户键入一个十六进制数,然后计算二进制表示形式中的个数,就像我键入 A 程序回显 1 一样。
我有这段代码使用查找 table 将二进制转换为十六进制并由 Aacini 在这里回答...
@echo off
setlocal
set "bin=110111101010110110111110111011111100101011111110"
call :bin2hex hex=%bin%
echo hex: %hex%
goto :EOF
:bin2hex hexVar=binValue
setlocal EnableDelayedExpansion
for %%a in (0000-0;0001-1;0010-2;0011-3;0100-4;0101-5;0110-6;0111-7;1000-8;1001-9;1010-A;1011-B;1100-C;1101-D;1110-E;1111-F) do (
for /F "tokens=1,2 delims=-" %%b in ("%%a") do (
set "hextable[%%b]=%%c"
)
)
set "hex="
set "bin=000%~2"
:bin2hexloop
set "hex=!hextable[%bin:~-4%]!%hex%"
set "bin=%bin:~0,-4%"
if defined bin if "%bin:~3%" neq "" goto bin2hexloop
endlocal & set "%~1=%hex%"
goto :EOF
我试图反转这段代码的工作方式,但没有成功!
这是我的尝试
@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 并对余数求和。
以 7 个十六进制数字为一组进行计算,因为批处理文件计算仅支持 31 位(2^31-1 或 2147483647 或 0x7FFFFFFF)。
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%
输出:
51
@ECHO OFF
SETLOCAL
FOR %%a IN (F37ABD abcdef 123 321 99 100 f11f 0 cafe) DO CALL :mainproc %%a
GOTO :eof
:mainproc
SET hexnum=%1
SET /a count1=0
:loop
SET /a hex1=0x%hexnum:~0,1%
:bitloop
SET /a count1+=%hex1% %% 2
SET /a hex1/=2
IF %hex1% gtr 0 GOTO bitloop
SET hexnum=%hexnum:~1%
IF DEFINED hexnum GOTO loop
ECHO %count1% 1s detected IN %1
GOTO :EOF
for
循环简单地将列表中的值依次赋值给变量%%a
,并使用该项目的参数(%1
)执行过程的主要部分.
在主程序中,初始化hexnum
作为要分析的数字,count1
初始化为1
s
的累积数字
然后将hex1
设置为0x
string before(复制hexnum
的第一个数字)这将是一个十六进制数字,0x0
到0xf
.因为这是 cmd
接受十六进制数的格式,所以它将 hex1
设置为十进制 0..15
接下来将 (hex1
mod 2) 添加到 count
,如果 odd/even
则为 1 或零
下半场 hex1
。由于 cmd
以整数 mode 计算,结果被截断,因此 6=>3 和 7+>3
结果>0,做下一位二进制数。重复直到 0.
抛出hexnum
的第一个字符(分配从字符1开始的子串,假设它从"character 0"开始计数)
如果 hexnum
有剩余字符,重复下一个十六进制数字
否则,报告。
结果:
17 1s detected IN F37ABD
17 1s detected IN abcdef
4 1s detected IN 123
4 1s detected IN 321
4 1s detected IN 99
1 1s detected IN 100
10 1s detected IN f11f
0 1s detected IN 0
11 1s detected IN cafe
如果我没理解错的话,你想要 不是 到 "convert a hexadecimal number to binary",而是 "count the ones that each hex digit have" 并累加它们(例如,对于 A,数字是1).这样,解决方案必须适用于 "The number of ones each hex digit have".
@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
我正在尝试编写一个批处理文件,要求用户键入一个十六进制数,然后计算二进制表示形式中的个数,就像我键入 A 程序回显 1 一样。
我有这段代码使用查找 table 将二进制转换为十六进制并由 Aacini 在这里回答...
@echo off
setlocal
set "bin=110111101010110110111110111011111100101011111110"
call :bin2hex hex=%bin%
echo hex: %hex%
goto :EOF
:bin2hex hexVar=binValue
setlocal EnableDelayedExpansion
for %%a in (0000-0;0001-1;0010-2;0011-3;0100-4;0101-5;0110-6;0111-7;1000-8;1001-9;1010-A;1011-B;1100-C;1101-D;1110-E;1111-F) do (
for /F "tokens=1,2 delims=-" %%b in ("%%a") do (
set "hextable[%%b]=%%c"
)
)
set "hex="
set "bin=000%~2"
:bin2hexloop
set "hex=!hextable[%bin:~-4%]!%hex%"
set "bin=%bin:~0,-4%"
if defined bin if "%bin:~3%" neq "" goto bin2hexloop
endlocal & set "%~1=%hex%"
goto :EOF
我试图反转这段代码的工作方式,但没有成功!
这是我的尝试
@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 并对余数求和。
以 7 个十六进制数字为一组进行计算,因为批处理文件计算仅支持 31 位(2^31-1 或 2147483647 或 0x7FFFFFFF)。
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%
输出:
51
@ECHO OFF
SETLOCAL
FOR %%a IN (F37ABD abcdef 123 321 99 100 f11f 0 cafe) DO CALL :mainproc %%a
GOTO :eof
:mainproc
SET hexnum=%1
SET /a count1=0
:loop
SET /a hex1=0x%hexnum:~0,1%
:bitloop
SET /a count1+=%hex1% %% 2
SET /a hex1/=2
IF %hex1% gtr 0 GOTO bitloop
SET hexnum=%hexnum:~1%
IF DEFINED hexnum GOTO loop
ECHO %count1% 1s detected IN %1
GOTO :EOF
for
循环简单地将列表中的值依次赋值给变量%%a
,并使用该项目的参数(%1
)执行过程的主要部分.
在主程序中,初始化hexnum
作为要分析的数字,count1
初始化为1
s
然后将hex1
设置为0x
string before(复制hexnum
的第一个数字)这将是一个十六进制数字,0x0
到0xf
.因为这是 cmd
接受十六进制数的格式,所以它将 hex1
设置为十进制 0..15
接下来将 (hex1
mod 2) 添加到 count
,如果 odd/even
下半场 hex1
。由于 cmd
以整数 mode 计算,结果被截断,因此 6=>3 和 7+>3
结果>0,做下一位二进制数。重复直到 0.
抛出hexnum
的第一个字符(分配从字符1开始的子串,假设它从"character 0"开始计数)
如果 hexnum
有剩余字符,重复下一个十六进制数字
否则,报告。
结果:
17 1s detected IN F37ABD
17 1s detected IN abcdef
4 1s detected IN 123
4 1s detected IN 321
4 1s detected IN 99
1 1s detected IN 100
10 1s detected IN f11f
0 1s detected IN 0
11 1s detected IN cafe
如果我没理解错的话,你想要 不是 到 "convert a hexadecimal number to binary",而是 "count the ones that each hex digit have" 并累加它们(例如,对于 A,数字是1).这样,解决方案必须适用于 "The number of ones each hex digit have".
@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