如何计算 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初始化为1s

的累积数字

然后将hex1设置为0xstring before(复制hexnum的第一个数字)这将是一个十六进制数字,0x00xf .因为这是 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