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:
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.
Ich hoffe ich konnte hiermit jemandem einiges an Zeit ersparen =)
LG BadBatchCoder
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 665630
Url: https://administrator.de/contentid/665630
Ausgedruckt am: 21.11.2024 um 17:11 Uhr
5 Kommentare
Neuester Kommentar
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
Natürlich eher Spielerei als wirklich nützlich.
Steffen
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
Steffen
Zitat von @Doskias:
Hi,
ich hab n PowerShell-Befehl der das kann
Wofür über 40 Zeilen Code, wenn es auch ein Einzeiler in PS kann?
Gruß
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 Danke für den Tipp.
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
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 Danke für den Tipp.
Grins...das kannte ich auch noch nicht. Mein Sohn hat das Thema gerade auf dem Gymi. Freu...Hausaufgaben in 30 Sek. kontrolliert 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 ...