Autor Beitrag
greno
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 16.05.09 20:33 
Hey Leute,
ich habe ein riesiges Problem und weiß echt net weiter:
Ich möchte ein einfaches Programm schreiben, mit dem ich Bitfehler simulieren kann, die in einem Byte auftreten,dh. ich erzeuge ein zufälliges Byte zB. 10010110, dieses wird dann "übertragen" und ein oder mehrere Bits werden gekippt zB. 10110010.

Ich bin so an die Sache gegangen, dass ich den Byte in einen String schreiben lasse, weil ich mir nicht anders zu helfen wusste...
Nun habe ich für jedes Bit eine gleiche Wahrscheinlichkeit p, die bestimmt, ob das Bit kippt.
Das ist alles kein Problem. Das Konzept ist vllt etwas umständlich aber nachvollziehbar, oder? :)
Nun kann ich jedes Bit mit einer for-to Schleife rausziehen und wenn die Wahrscheinlichkeit eintritt(mache ich mit random) möchte ich das Bit kippen. Das habe ich mir so überlegt:

Neues Bit:=ABS(Altes Bit-1)

Char und Integer ist aber nicht kompatibel und anders kriege ich es auch nicht hin was würdet ihr vorschlagen, wie diese Aufgabe zu lösen ist?

Danke schonmal :)
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Sa 16.05.09 20:39 
Bitweise Operatoren sind dein Freund - in deinem Fall xor.
Ein einzelnes Byte mit nur einem gesetzten Bit kannst du mit 1 shl <Nummer des Bits> erzeugen.

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
greno Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 16.05.09 21:17 
Mit sowas hab ich mich noch nicht auseinandergesetzt... Also bitte ganz von vorne, in welchem format muss das alles sein etc. (string oder int) ich blick da echt nicht durch ist auch irgendwie peinlich dass ich von bitweisen Operatoren keine große Ahnung habe.

Wäre wirklich dankbar wenn mich jemand da ein bisschen ranführen kann.

Danke

ps:wie kann ich das byte dann anzeigen das ist auch ein problem... bytetostring ? :P
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 16.05.09 21:32 
greno Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 16.05.09 21:37 
vielen vielen dank, heute habe ich aber keine lust mehr mir das anzutun :)
deswegen werde ich mich morgen nochmal dransetzen.

MFG
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 16.05.09 21:45 
Kein Problem. Wenn Du das begriffen hast, kannst Du Dir dann auch relativ leicht selbst eine Funktion schreiben, die Dir aus einer Zahl eine binäre Stringdarstellung erstellt.
greno Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 17.05.09 12:32 
hallo miteinander,
vielen dank nochmal für die schnelle hilfe.

ich habe glaube ich die problematik soweit verstanden jetzt und auch wie man mit diesen flags rechnen kann.. nur mein problem ist jetzt wie man das anschaulich macht also irgendwie anzeigt.
ich krieg das byte halt nicht in ein label oder editfeld, was das wichtigste an meinem projekt wäre.

tut mir leid wenn ich mich ein bischen doof anstelle,bin aber nie über int,real,string und ganz wenig boolean hinausgegangen, grundkurs eben.
wenn ich den ansatz erstmal habe, werde ich euch nicht mehr mit solchen fragen belästigen, versprochen :D

dankeschön
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: So 17.05.09 12:49 
user profile icongreno hat folgendes geschrieben Zum zitierten Posting springen:
ich habe glaube ich die problematik soweit verstanden jetzt und auch wie man mit diesen flags rechnen kann.. nur mein problem ist jetzt wie man das anschaulich macht also irgendwie anzeigt.
ich krieg das byte halt nicht in ein label oder editfeld, was das wichtigste an meinem projekt wäre.

Es gibt diverse Funktionen, um ein Byte in einen String umzuwandeln.

Hier ein Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function IntToBin(Int: Integer): String;
  var
    i : Integer;
begin
  Result := '';
  for i := 7 downto 0 do
    Result := Result + IntToStr((Int shr i) and 1);
end;

Diese Funktion prüft alle Byte-Indizes (von 7 bis 0) auf 0 oder 1. Dafür wird das Byte jeweils um den entsprechenden Index nach Rechts geshiftet. Das zu prüfende Bit steht damit ganz rechts und kann nun mittels and 1 "geprüft" werden.

Grüße,
Marc


Zuletzt bearbeitet von Marc. am So 17.05.09 12:52, insgesamt 1-mal bearbeitet
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 17.05.09 12:50 
Hier eine von vielen Implementierungen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function IntToBinaryString(Number: integer): string;
const BitChars: array[Boolean] of char = ('0','1');
var i, CurrentBit: integer;
begin
  SetLength(Result,SizeOf(integer) shl 3);
  CurrentBit := 1 shl Pred(SizeOf(integer) shl 3);
  for i := 1 to Length(Result) do
    begin
      Result[i] := BitChars[(Number and CurrentBit) = CurrentBit];
      CurrentBit := CurrentBit shr 1;
    end;
end;
greno Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 17.05.09 12:53 
okay. ich hatte eben eine ähnliche idee, dass man dem byte erstmal einen zufälligen wert gibt und dann das byte bitweise von rechts nach links abfragt ob an dem bestimmten bit eine 1 oder 0 steht, das dann in einem string speichert und diesen ausgibt. kann man eine solche abfrage machen?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 17.05.09 12:56 
Schau Dir beide Beispiele einmal ganz genau an, dann sollte Dir das Prinzip bekannt vorkommen (gut, ich gehe die Zahl von links nach rechts durch, aber prinzipiell macht das keinen großen Unterschied).
greno Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 17.05.09 13:17 
also ich blick durch die erste function besser durch, vielen dank euch beiden, ich glaube ich habe das jetzt soweit verstanden also mal ein beispiel:
ich habe die int-zahl 6 oder binär 00000110.
so, wenn ich jetzt 6 shr 2 mache, wird das zweite bit von rechts(?!?) nach ganz rechts verschoben: (00000101) falsch
und man kann nur das bit ganz rechts ausgeben...

wenn ich das so schreibe merke ich, dass ich doch noch nicht so viel verstanden habe...

edit: also mir ist jetzt klar, dass ALLE bits um shr (stellen) nach rechts verschoben werden. aber stimmt das, dass man nur das bit ganz rechts, das LSB ausgeben kann?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: So 17.05.09 14:42 
user profile icongreno hat folgendes geschrieben Zum zitierten Posting springen:
aber stimmt das, dass man nur das bit ganz rechts, das LSB ausgeben kann?

Du könntest auch mit dem hochwertigsten Bit beginnen oder mittendrin. Nur ist die Frage, ob das Sinn macht. ;)
greno Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 17.05.09 15:32 
naja ich hab mich ein bischen durchgekämpft ich werde das resultat mal posten nachher,
vielen dank für eure hilfe, ohne euch wäre das echt nix geworden.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

also ich hab jetzt ein echtes problem und krieg gleich nen nervenzusammenbruch:

warum kann ich damit mein erzeugtes byte nicht invertieren (das byte ist das integer a):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button2Click(Sender: TObject);
begin
s:='';
 for z:=7 downto 0 do
 begin
  if (a shr z)=0
   then s:=s+IntTostr((a shr z) or 1)
   else s:=s+inttostr((a shr z) and 0);
 end;
form1.edit2.text:=s;
end;

man zieht die bits ganz nach rechts, wenn es 0 ist dann wird es durch or 1 zu einer 0, wenn es 1 ist wird es durch and 0 zu einer 0...
warum geht das nicht wo ist der fehler?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: So 17.05.09 15:38 
user profile icongreno hat folgendes geschrieben Zum zitierten Posting springen:
man zieht die bits ganz nach rechts, wenn es 0 ist dann wird es durch or 1 zu einer 0, wenn es 1 ist wird es durch and 0 zu einer 0...
warum geht das nicht wo ist der fehler?

or 1 wird immer 1! Zudem versteh ich die Logik deiner IF-Abfrage nicht. :nixweiss:
Wie genau sollte das funktionieren?

Edit: Wenn du es schon mit einer IF-Abfrage machen willst, dann so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function IntToBin2(ANum: Integer): String;
var
  i: Integer;
begin
  result := '';
  for i := 7 downto 0 do
  begin
    if (ANum shr i) = 0 then  // Diesen Teil
      result := result + '0' // kannst du Dir aber
    else                    // komplett sparen!!
      result := result + inttostr((ANum shr i) and 1);
  end;
end;


PS: Bitte benutz für deinen Code die Delphi-Tags [delphi] [/delphi]
greno Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 17.05.09 15:50 
ja ich hab irgendwo da eine denkblockade

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
var
  Form1: TForm1;
  a,z: integer;
  s:string;

implementation

function IntToBin(Int: Integer): String;
  var
    i : Integer;
begin
  Result := '';
  for i := 7 downto 0 do
    Result := Result + IntToStr((Int shr i) and 1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
a:=random(256);
edit1.text:=inttobin(a);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
s:='';
 for z:=7 downto 0 do
 begin
  if (a shr z)=0
   then s:=s+IntTostr((a shr z) or 1)
   else s:=s+inttostr((a shr z) and 0);
 end;
form1.edit2.text:=s;
end;


das mit der if abfrage soll heissen:
wenn der abgefragte bit den wert 0 hat dann wird er nun im inverteierten byte eine 1,
wenn der abgefragte bit keine 0 ist (also eine 1 :P) dann wird er durch and 0 eine 0... aber das geht so nicht, ich bin mir glaube ich auch noch zu unsicher was a shr z jetzt genau heisst...
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: So 17.05.09 15:56 
Pardon, nun hab ich es verstanden.
Es reicht doch mein erstes Beispiel ein klein wenig zu modifizieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function IntToBin(Int: Integer): String;
  var
    i : Integer;
begin
  Result := '';
  for i := 7 downto 0 do
    Result := Result + IntToStr(not (Int shr i) and 1);
end;
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 17.05.09 15:57 
Vermutlich suchst Du xor. shr verschiebt die Zahl um x stellen nach rechts.
ausblenden Quelltext
1:
2:
3:
4:
5 shr 2
00000101 //5
//Verschiebung um 2 Stellen nach rechts ergibt
00000001 //1
greno Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 17.05.09 16:02 
danke marc so hab ich das auch versucht ist mir aber nicht gelungen irgendwie :oops: das schau ich mir nochmal genauer an.
danke deddy, hab mir das auch gedacht, wurde aber von misserfolg zu misserfolg immer unsicherer ^^

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

So habs endlich hingekriegt, für so ein miniprogramm 4 stunden vorm pc gehockt aber glaube ich habs jetzt gerafft :D
Vielen Dank nochmal, ich meld mich bestimmt spätestens morgen für das nächste Problem, ich hab da schon eine Vorahnung wo ich nicht weiter kommen werde.