3 Stimmen

Wie mache ich ein bitweises und in einer Bat-Datei?

Ich habe es mit dem Folgenden versucht, aber es heißt nur "& war zu diesem Zeitpunkt unerwartet".

@echo off
:enter-input
echo Please enter a number between 1 and 15:
echo 1 = Selection one
echo 2 = Selection two
echo 4 = Selection three
echo 8 = Selection four
echo x = Quit

set INPUT=
set /P INPUT=Type number: %=%

if "%INPUT%" == "" goto enter-input
if "%INPUT%" == "x" goto end
if "%INPUT%" == "X" goto end

set /A %INPUT%
if %INPUT% & 1 == 1 echo Selection one
if %INPUT% & 2 == 2 echo Selection two
if %INPUT% & 4 == 4 echo Selection three
if %INPUT% & 8 == 8 echo Selection four

echo Done
:end

8voto

dbenham Punkte 122915

Es ist möglich, die bitweisen Berechnungen und den Vergleich in einer einzigen Anweisung durchzuführen. Der Trick besteht darin, absichtlich einen Fehler beim Dividieren durch Null zu erzeugen, wenn das Ergebnis das ist, was Sie suchen. Natürlich sollte stderr auf nul umgeleitet werden, und die || Operator wird verwendet, um auf die Fehlerbedingung zu testen (mit der Angabe TRUE).

Diese Technik macht jede Zwischenvariable überflüssig.

@echo off
:enter-input
set "input="
echo(
echo Please enter a number between 1 and 15:
echo 1 = Selection one
echo 2 = Selection two
echo 4 = Selection three
echo 8 = Selection four
echo x = Quit

set /P INPUT=Type number:

if not defined input goto enter-input
if /i "%input%" == "X" exit /b

2>nul (
  set /a "1/(1-(input&1))" || echo Selection one
  set /a "1/(2-(input&2))" || echo Selection two
  set /a 1/(4-(input^&4^)^) || echo Selection three
  set /a 1/(8-(input^&8^)^) || echo Selection four
)
pause
goto enter-input

In der akzeptierten Antwort wurde das Offensichtliche nie erwähnt: Sonderzeichen wie & y ) muss innerhalb der SET /A-Berechnung entweder in Anführungszeichen gesetzt werden. In dem obigen Beispiel habe ich absichtlich beide Techniken demonstriert.


EDIT : Die Logik kann noch einfacher gestaltet werden, indem man die Logik umkehrt (durch Null dividieren, wenn falsch) und die && Betreiber.

2>nul (
  set /a "1/(input&1)" && echo Selection one
  set /a "1/(input&2)" && echo Selection two
  set /a 1/(input^&4^) && echo Selection three
  set /a 1/(input^&8^) && echo Selection four
)

5voto

loraderon Punkte 4568

Ich habe eine Möglichkeit gefunden, dies zu tun.

@echo off
:enter-input
echo Please enter a number between 1 and 15:
echo 1 = Selection one
echo 2 = Selection two
echo 4 = Selection three
echo 8 = Selection four
echo x = Quit

set /P INPUT=Type number:

if "%INPUT%" == "" goto enter-input
if "%INPUT%" == "x" goto end
if "%INPUT%" == "X" goto end

set /A isOne = "(%INPUT% & 1) / 1"
set /A isTwo = "(%INPUT% & 2) / 2"
set /A isThree = "(%INPUT% & 4) / 4"
set /A isFour = "(%INPUT% & 8) / 8"

if %isOne% == 1 echo Selection one
if %isTwo% == 1 echo Selection two
if %isThree% == 1 echo Selection three
if %isFour% == 1 echo Selection four

echo Done
:end

1voto

Zimba Punkte 1969

Bei bitweisem UND den Ausdruck in Anführungszeichen setzen, um Fehler zu vermeiden
z. B. set /a "48 & 23"

0voto

nusi Punkte 986
SET LEFT = 1
SET RIGHT = 2
SET /A RESULT = %LEFT% & %RIGHT%

Bitte geben Sie das kaufmännische Und-Zeichen (&) mit einem '^' ein, wenn Sie es direkt in cmd.exe versuchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X