badbatchcoder
Goto Top

Umwandeln einer Dezimalzahl in eine Binärzahl

Hey,
ich habe ein fertiges Skript für die Umwandlung einer Dezimalzahl in einer binäre Zahl. Zurzeit kann man damit Zahlen von 0 bis 65535 in einen 16-stelligen Binärcode umwandeln, das Programm ist aber leicht erweiterbar.
Man kann sowas sicherlich eleganter umsetzen, aber das hier ist meine Version:

@echo off
:start
cls
set /p dec="Dezimalzahl: "  
if %dec% GTR 65535 goto start

set /a bb9=%dec%/32768
if %bb9%==1 set /a dec=%dec%-32768
set /a bb8=%dec%/16384
if %bb8%==1 set /a dec=%dec%-16384
set /a bb7=%dec%/8192
if %bb7%==1 set /a dec=%dec%-8192
set /a bb6=%dec%/4096
if %bb6%==1 set /a dec=%dec%-4096
set /a bb5=%dec%/2048
if %bb5%==1 set /a dec=%dec%-2048
set /a bb4=%dec%/1024
if %bb4%==1 set /a dec=%dec%-1024
set /a bb3=%dec%/512
if %bb3%==1 set /a dec=%dec%-512
set /a bb2=%dec%/256
if %bb2%==1 set /a dec=%dec%-256

set /a b8=%dec%/128
if %b8%==1 set /a dec=%dec%-128
set /a b7=%dec%/64
if %b7%==1 set /a dec=%dec%-64
set /a b6=%dec%/32
if %b6%==1 set /a dec=%dec%-32
set /a b5=%dec%/16
if %b5%==1 set /a dec=%dec%-16
set /a b4=%dec%/8
if %b4%==1 set /a dec=%dec%-8
set /a b3=%dec%/4
if %b3%==1 set /a dec=%dec%-4
set /a b2=%dec%/2
if %b2%==1 set /a dec=%dec%-2
set /a b1=%dec%/1

set bin=%bb8%%bb8%%bb7%%bb6%%bb5%%bb4%%bb3%%bb2% %b8%%b7%%b6%%b5%%b4%%b3%%b2%%b1%
echo %bin%

pause
goto start

Zusätzlich habe ich noch ein zweites Skript geschrieben, womit sich eine Textdatei mit den Zahlen 0 bis 65535 und zugehöriger Binärzahl erstellen lässt.

@echo off

set counter=0
set bin=00000000 00000000
set "col=>"  

:counter


mode con lines=7 cols=30
set /a operation=%counter%/656
echo Textdokument wird erstellt...
echo.
echo %operation%%%
echo.
echo (%counter% von 65535)
echo %bin%



echo %counter% %bin% %col%binary.txt

set "col=>>"  
set /a counter=%counter%+1
if %counter%==65536 exit

:dec_to_bin
set counter2=%counter%

set /a bb9=%counter2%/32768
if %bb9%==1 set /a counter2=%counter2%-32768
set /a bb8=%counter2%/16384
if %bb8%==1 set /a counter2=%counter2%-16384
set /a bb7=%counter2%/8192
if %bb7%==1 set /a counter2=%counter2%-8192
set /a bb6=%counter2%/4096
if %bb6%==1 set /a counter2=%counter2%-4096
set /a bb5=%counter2%/2048
if %bb5%==1 set /a counter2=%counter2%-2048
set /a bb4=%counter2%/1024
if %bb4%==1 set /a counter2=%counter2%-1024
set /a bb3=%counter2%/512
if %bb3%==1 set /a counter2=%counter2%-512
set /a bb2=%counter2%/256
if %bb2%==1 set /a counter2=%counter2%-256

set /a b8=%counter2%/128
if %b8%==1 set /a counter2=%counter2%-128
set /a b7=%counter2%/64
if %b7%==1 set /a counter2=%counter2%-64
set /a b6=%counter2%/32
if %b6%==1 set /a counter2=%counter2%-32
set /a b5=%counter2%/16
if %b5%==1 set /a counter2=%counter2%-16
set /a b4=%counter2%/8
if %b4%==1 set /a counter2=%counter2%-8
set /a b3=%counter2%/4
if %b3%==1 set /a counter2=%counter2%-4
set /a b2=%counter2%/2
if %b2%==1 set /a counter2=%counter2%-2
set /a b1=%counter2%/1

set bin=%bb8%%bb8%%bb7%%bb6%%bb5%%bb4%%bb3%%bb2% %b8%%b7%%b6%%b5%%b4%%b3%%b2%%b1%
goto counter

Ich hoffe ich konnte hiermit jemandem einiges an Zeit ersparen =)
LG BadBatchCoder

Content-ID: 665630

Url: https://administrator.de/contentid/665630

Ausgedruckt am: 21.11.2024 um 17:11 Uhr

rubberman
rubberman 12.04.2021 um 00:22:43 Uhr
Goto Top
Meine Funktionen für Zahlen -2147483648 .. 2147483647, von und zu Basis 2 .. 36:
https://www.dostips.com/forum/viewtopic.php?f=3&t=9810&p=63111
@echo off&setlocal EnableDelayedExpansion
:: integer: -2147483648 .. 2147483647
:: base: 2 .. 36

for %%n in (-2147483648 -2147483647 -2 -1 0 1 2 2147483646 2147483647) do (
  echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  for /l %%i in (2 1 36) do (
    call :ToBaseX %%n %%i b%%i
    echo To Base %%i: !b%%i!
  )
  echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  for /l %%i in (2 1 36) do (
    call :FromBaseX !b%%i! %%i dec
    echo From Base %%i: !dec!
  )
  echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
)

pause
goto :eof

:ToBaseX
:: call :ToBaseX [decimal number] [base] [variable name for the resulting string]
setlocal EnableDelayedExpansion
set "val="&set "map=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"  
2>nul (set /a "dec=(%~1)"||set /a "dec=~2147483647")  
set /a "base=(%~2),b=base-1,sh=30-((-(b>>1)>>31)&1)-((-(b>>2)>>31)&1)-((-(b>>3)>>31)&1)-((-(b>>4)>>31)&1)-((-(b>>5)>>31)&1),hi=(dec>>sh)&((1<<(32-sh))-1),op=(dec&((1<<sh)-1))+((hi%%base)<<sh),hi/=base,chk=hi|op"  
for /l %%i in (1 1 32) do if !chk! neq 0 (
  set /a "d=op%%base,op=(op/base)+((hi%%base)<<sh),hi/=base,chk=hi|op"  
  for %%D in (!d!) do set "val=!map:~%%D,1!!val!"  
)
if not defined val set "val=0"  
endlocal&set "%~3=%val%"  
exit /b

:FromBaseX
:: call :FromBaseX [numerical string using radix 'base'] [base] [variable name for the resulting decimal number] 
setlocal EnableDelayedExpansion
set "val=%~1"  
set /a "base=(%~2),dec=0,powers=1,d0=0,d1=1,d2=2,d3=3,d4=4,d5=5,d6=6,d7=7,d8=8,d9=9,dA=10,dB=11,dC=12,dD=13,dE=14,dF=15,dG=16,dH=17,dI=18,dJ=19,dK=20,dL=21,dM=22,dN=23,dO=24,dP=25,dQ=26,dR=27,dS=28,dT=29,dU=30,dV=31,dW=32,dX=33,dY=34,dZ=35"  
for /l %%i in (1 1 32) do if defined val (
  for %%D in (!val:~-1!) do set /a "dec+=!d%%D!*powers,powers*=base"  
  set "val=!val:~0,-1!"  
)
endlocal&set "%~3=%dec%"  
exit /b
Natürlich eher Spielerei als wirklich nützlich.

Steffen
Doskias
Doskias 13.04.2021 um 16:03:51 Uhr
Goto Top
Hi,

ich hab n PowerShell-Befehl der das kann

[Convert]::ToString(255, 2)

Wofür über 40 Zeilen Code, wenn es auch ein Einzeiler in PS kann?

Gruß
Doskias
NixVerstehen
NixVerstehen 13.04.2021 um 18:31:17 Uhr
Goto Top
Zitat von @Doskias:

Hi,

ich hab n PowerShell-Befehl der das kann

[Convert]::ToString(255, 2)

Wofür über 40 Zeilen Code, wenn es auch ein Einzeiler in PS kann?

Gruß
Doskias

Grins...das kannte ich auch noch nicht. Mein Sohn hat das Thema gerade auf dem Gymi. Freu...Hausaufgaben in 30 Sek. kontrolliert face-smile Danke für den Tipp.
rubberman
rubberman 13.04.2021 um 18:36:42 Uhr
Goto Top
Wofür über 40 Zeilen Code
Die hab ich ja jeweils schon auf 10 Zeilen eingedampft. Schleifen statt copy/paste von grundsätzlich immer wieder den gleichen 2 Zeilen Code, machen da die Welt.
Ich spiel schon so lange mit Batch rum (ist meinem biblischen Alter geschuldet). Somit kenne ich die ganzen Unzulänglichkeiten von Batch nur zu gut und kann dir nur Recht geben. Wer heute noch anfängt sich mit Batch zu beschäftigen, ist selbst schuld. Mit PowerShell stehen die kompletten Möglichkeiten von .NET zur Verfügung. Allerdings führt die Versuchung möglichst alles per Pipe in eine Zeile zu quetschen in PowerShell ebenso zu unleserlichem Code, wie die Unart in Batch mit GOTOs Spagetti-Code zu schreiben, wo man lieber Subroutinen nutzen sollte. Egal, ist eigentlich off-topic ...

Steffen
Doskias
Doskias 14.04.2021 um 09:23:20 Uhr
Goto Top
Zitat von @NixVerstehen:
Grins...das kannte ich auch noch nicht. Mein Sohn hat das Thema gerade auf dem Gymi. Freu...Hausaufgaben in 30 Sek. kontrolliert face-smile Danke für den Tipp.

Falls die Hausaufgaben dann schwieriger werden und Dezimal zu Hexadezimal oder Hexadezimal zu Binär verlangen:
https://soykablog.wordpress.com/2012/08/22/three-ways-to-convert-decimal ...