Bits testen
-
- Beiträge: 37
- Registriert: Do 23. Feb 2012, 03:41
Bits testen
Ich wollte mal fragen wie man mit Pascal einzelne Bits von einem Byte testen kann?
Also ich habe z.B. einen Byte mit dem Wert 137, wie kann ich testen welche Bits der 8 Stellen des Bytes gesetzt sind, also z.B. 01001001.
Und umgekehrt, wie kann ich eine Bitfolge in einen Intwert umrechnen?
Also ich habe z.B. einen Byte mit dem Wert 137, wie kann ich testen welche Bits der 8 Stellen des Bytes gesetzt sind, also z.B. 01001001.
Und umgekehrt, wie kann ich eine Bitfolge in einen Intwert umrechnen?
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: Bits testen
ich glaube dafür gibt es die funktion "shl". Wie man die genau anwendet weis ich komischerweise nicht, da ich nie bitweise arbeite
Aber sicherlich kennen eine menge Leute hier ein kleinen Beispiel oder du suchst einfach mal auf Google "shl delphi"

Code: Alles auswählen
Signatur := nil;
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Bits testen
Teste Bit n
if (x and (1 shl n)) <> 0 then ....
Wenn Du viele Einzel-Bits verwalten willst nimmst du einen "set" Typ. (Die Binär-Arithmentik ist identisch mit der Mengen-Arithmetik.)
-Michael
if (x and (1 shl n)) <> 0 then ....
Wenn Du viele Einzel-Bits verwalten willst nimmst du einen "set" Typ. (Die Binär-Arithmentik ist identisch mit der Mengen-Arithmetik.)
-Michael
-
- Beiträge: 37
- Registriert: Do 23. Feb 2012, 03:41
Re: Bits testen
Hi, ich habe schon ein wenig herumprobiert, kann das aber nicht wirklich richtig auf meinen Code anwenden.
Was müsste ich bei mir ändern?
Ich dachte erst ich könnte mit XOR alle anderen Bits abziehen und das so testen, klappt aber leider nur wenn alle bis auf Bit X gesetzt sind
Was müsste ich bei mir ändern?
Ich dachte erst ich könnte mit XOR alle anderen Bits abziehen und das so testen, klappt aber leider nur wenn alle bis auf Bit X gesetzt sind

Code: Alles auswählen
function kanal_test(Kanal : ShortInt) : Boolean;
var
kanal_status, lpt_status : Integer;
begin
lpt_status := parport_wert;
if Kanal = 1 then begin
kanal_status := (lpt_status XOR 254);//bit entfernen = aktivieren
ShowMessage('XOR ergebnis'+IntToStr(kanal_status));
if kanal_status = 1 then begin
Result := False;
ShowMessage('false');
end else begin
Result := True;
ShowMessage('true');
end;
end;
end;
-
- Beiträge: 37
- Registriert: Do 23. Feb 2012, 03:41
Re: Bits testen
Damit ich das richtig verstehe alsomschnell hat geschrieben:Teste Bit n
if (x and (1 shl n)) <> 0 then ....
Wenn Du viele Einzel-Bits verwalten willst nimmst du einen "set" Typ. (Die Binär-Arithmentik ist identisch mit der Mengen-Arithmetik.)
-Michael
Code: Alles auswählen
if (x and (1 shl n)) <> 0 then
Code: Alles auswählen
if (MEINE_INT_ZAHL and (BIT_STATUS shl STELLE_DES_BITS)) <> 0 then

-
- Lazarusforum e. V.
- Beiträge: 240
- Registriert: Di 5. Feb 2008, 15:32
- OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
Re: Bits testen
Vermutlich willst du ja wissen, welche Pins vom Parallelport Spannung haben und welche nicht.
Hab jetzt keinen Code zur Hand, aber wenn ich mich richtig erinnere ist ein Pin von den vieren, die man auslesen kann, invertiert, liefert also den gegenteiligen Wert. Ich meine dass ich da als ersten Schritt ein XOR gemacht habe um die Invertierung 'zurückzubiegen'.
Eb
Hab jetzt keinen Code zur Hand, aber wenn ich mich richtig erinnere ist ein Pin von den vieren, die man auslesen kann, invertiert, liefert also den gegenteiligen Wert. Ich meine dass ich da als ersten Schritt ein XOR gemacht habe um die Invertierung 'zurückzubiegen'.
Eb
-
- Beiträge: 37
- Registriert: Do 23. Feb 2012, 03:41
Re: Bits testen
Das mit dem invertieren ist erstmal egal, ich brauche ja nur 0 oder 1 um danach selbst zu invertieren, ich schlage mich gerade hiermit herum:Eb hat geschrieben:Vermutlich willst du ja wissen, welche Pins vom Parallelport Spannung haben und welche nicht.
Hab jetzt keinen Code zur Hand, aber wenn ich mich richtig erinnere ist ein Pin von den vieren, die man auslesen kann, invertiert, liefert also den gegenteiligen Wert. Ich meine dass ich da als ersten Schritt ein XOR gemacht habe um die Invertierung 'zurückzubiegen'.
Eb
http://www.lernnetz-sh.de/kmLinux/doc/P ... as622.html" onclick="window.open(this.href);return false;
http://www.functionx.com/objectpascal/Lesson09.htm" onclick="window.open(this.href);return false;
Irgendwie will das nicht richtig funktionieren

-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Bits testen
Nö !chickendev hat geschrieben:Teste Bit n würde bedeutenCode: Alles auswählen
if (MEINE_INT_ZAHL and (BIT_STATUS shl STELLE_DES_BITS)) <> 0 then
Der Bitstatus ist das, was beim "If" rauskommt.
Wenn Bitstatus sinnvollerweise ein logischer Wert ist (Boolean) ist also
Bitstatus = (x and (1 shl n)) <> 0;
Wenn Du ein Bit entsprechend Bitstatus setzen willst:
if Bitstatus then x := x or (1 shl n); else x := x and ( not (1 shl n));
-Michael
-
- Beiträge: 37
- Registriert: Do 23. Feb 2012, 03:41
Re: Bits testen
Vielen Dank!!!!
Es hat jetzt funktioniert!
Hier der Code, für alle die das nicht wissen, die Stelle des Bits ist gleich minus 1. Wollt Ihr Bit 7 abfragen muss n = 6 sein.
Es hat jetzt funktioniert!

Hier der Code, für alle die das nicht wissen, die Stelle des Bits ist gleich minus 1. Wollt Ihr Bit 7 abfragen muss n = 6 sein.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
x,n : Integer;
Bitstatus : Boolean;
begin
Bitstatus := FALSE;
n := StrToIntDef(Edit6.Caption,0);
x := StrToIntDef(Edit1.Caption,0);
Bitstatus := (x and (1 shl n)) <> 0;
if Bitstatus then Edit7.Caption := 'TRUE';
if Bitstatus = False then Edit7.Caption := 'FALSE';
end;
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: Bits testen
Gegenfrage wenn erlaubt. Wenn ich richtig sehe, braucht du ja nur den Bitstatus für die Endauswertung. wäre es da nicht sinnvoll, wenn die procedure verkürz wird? zugegeben bei Boolischen abfragen schenk ich mir schon die Zuweisung auf True bzw false.chickendev hat geschrieben:Vielen Dank!!!!
Es hat jetzt funktioniert!![]()
Hier der Code, für alle die das nicht wissen, die Stelle des Bits ist gleich minus 1. Wollt Ihr Bit 7 abfragen muss n = 6 sein.Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject); var x,n : Integer; Bitstatus : Boolean; begin Bitstatus := FALSE; n := StrToIntDef(Edit6.Caption,0); x := StrToIntDef(Edit1.Caption,0); Bitstatus := (x and (1 shl n)) <> 0; if Bitstatus then Edit7.Caption := 'TRUE'; if Bitstatus = False then Edit7.Caption := 'FALSE'; end;


empfehle dir daher die zeilen, sollte ggf auch 3 Zeilen Code sparen.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
x,n : Integer;
begin
n := StrToIntDef(Edit6.Caption,0);
x := StrToIntDef(Edit1.Caption,0);
if (x and (1 shl n)) = 1 then Edit7.Caption := 'TRUE'
else Edit7.Caption := 'FALSE';
end;
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache
und der Kreis Segeberg meine LIEBE 


- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: Bits testen
Code: Alles auswählen
if (x and (1 shl n)) = 1 then Edit7.Caption := 'TRUE
Richtig wäre :
Code: Alles auswählen
if (x and (1 shl n)) = (1 shl n) then Edit7.Caption := 'TRUE
--
Just try it
Just try it
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Bits testen
Odercorpsman hat geschrieben:Code: Alles auswählen
if (x and (1 shl n)) = (1 shl n) then Edit7.Caption := 'TRUE
Code: Alles auswählen
if (x and (1 shl n)) <> 0 then Edit7.Caption := 'TRUE
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: Bits testen
Hmmm da ist das Quasi nur zufall, das Meine Variante geht?corpsman hat geschrieben:Das ist fasch, bzw gillt nur für n = 0Code: Alles auswählen
if (x and (1 shl n)) = 1 then Edit7.Caption := 'TRUE
Richtig wäre :
Code: Alles auswählen
if (x and (1 shl n)) = (1 shl n) then Edit7.Caption := 'TRUE
Hier mal ein Codeschnippsel, wie ich diese verwende...
Code: Alles auswählen
procedure TForm2.FormShow(Sender: TObject);
begin
if (conf and (1 shl 0)) = 1 then
// if Conf[1] then //SetCom
begin
_Text[1]:= TLabel.Create(self);
with _Text[1] do
begin
Parent := Self;
Left := 17;
Top := 13;
Caption := 'Netzwerkname:';
end;
Edit[1]:= TEdit.Create(self);
with Edit[1] do
begin
Parent := Self;
Left := 17;
Top := 32;
end;
_Text[2] := TLabel.Create(self);
with _Text[2] do
begin
Parent := self;
Left := 17;
Top := 72;
Hint := 'z.B. 192.168.1.1';
Caption := 'IP-Adresse des Netzwerkes';
ShowHint :=True;
end;
Edit[2] := TEdit.Create(self);
with Edit[2] do
begin
Left := 17;
Top := 96;
end;
end
end;
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache
und der Kreis Segeberg meine LIEBE 


-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Bits testen
Ja. Überlege mal was "1 shl 0" ergibt.Maik81ftl hat geschrieben: Hmmm da ist das Quasi nur zufall, das Meine Variante geht?
Martin
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Bits testen
Code: Alles auswählen
{$mode delphi}
type byteset = set of 0..7;
const bools : array[false..true] of char = ('0','1');
var b : Byte;
i : integer;
begin
b:=137;
for i:=7 downto 0 do
write(bools[i in byteset(b)]);
writeln;
end.