Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Array of Boolean -> Byte-Variable


MrFox - Sa 09.07.05 19:50
Titel: Array of Boolean -> Byte-Variable
Hi Leute,

Ich möchte ein Array[0..7] of Boolean, das 1 Byte repräsentiert in eine BYTE variable umwandeln

(um daraus wiederrum einen Buchstaben werden zu lassen)

Jetzt hab ich mir da schon so 'ne Funktion geschrieben, da funktioniert aber irgendwas nicht...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var wert:byte;
    bytes:Array[0..7of Boolean;

...

for i := 7 downto 0 do 
   begin
   wert := wert shl 1;
   if bytes[i] = true then wert := wert or 1 else wert := wert or 0;
   end;


maxk - Sa 09.07.05 20:07

Also, eigentlich sollte es gehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var wert:byte;  
    bytes:Array[0..7of Boolean;  

{...}

  wert:=0;
  for i := 7 downto 0 do begin
   wert:=wert shl 1;
   if bytes[i] then  Inc(Wert);
  end;


ManuelGS - Sa 09.07.05 20:10

@maxk, muss man da nicht der variable wert vorher 0 zugewiesen werden? fängt ja sonst vielleicht mit 5 etc. an.


maxk - Sa 09.07.05 20:12

Stimmt, ich hatte mich da gerade selber ein bisschen verwirrt. Aber nach 100mal editieren, glaube ich meine Endfassung gefunden zu haben ;)


ManuelGS - Sa 09.07.05 20:26


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var wert:byte;
    bytes:Array[0..7of Boolean;
    i:integer;

begin
bytes[0]:=true;
bytes[1]:=true;
bytes[2]:=true;
bytes[3]:=false;
bytes[4]:=false;
bytes[5]:=false;
bytes[6]:=true;
bytes[7]:=false;         //11100010b  - 226d *räusper*

  wert:=0;
  for i := 0 to 7 do begin
  wert:=wert shl 1;
   if bytes[i] then wert:=wert or 1;

  end;
showmessage(inttostr(wert));


maxk - Sa 09.07.05 21:38

11100010b ist aber 226d - und das ermittelt auch der Code ;)


ManuelGS - Sa 09.07.05 22:05

262 ist eine sogenannte "Manuelzahl". Man berechnet sie, indem man die Ziffern einer beliebigen Zahl z nimmt, und in zufälliger Reihenfolge anordnet.
Hast du das etwa nicht gewusst? :wink:

lol


BenBE - Sa 09.07.05 22:53

Leichtere Möglichkeit:


Delphi-Quelltext
1:
type TBitSet = set of 0..7;                    


Danach einfach Include(Bits, BitNumber); um das BitNumber-te Bit zu einer Zahl hinzuzufügen oder Exclude(Bits, BitNumber); um das BitNumber-te Bit aus einer Zahl zu entfernen.

In ein Byte wird das ganze dann mit ByteVal := Byte(TBitSet(Bits)); konvertiert.


maxk - So 10.07.05 00:03

user profile iconManuelGS hat folgendes geschrieben:
262 ist eine sogenannte "Manuelzahl". Man berechnet sie, indem man die Ziffern einer beliebigen Zahl z nimmt, und in zufälliger Reihenfolge anordnet.
Das steht in meiner nächsten Infoklausur ;)

@BenBE: Verblüffent einfach :autsch:


MrFox - So 10.07.05 11:23

Hab den Fehler selbst gefunden. Meine Funktion war völlig richtig, ich bin das ganze bloß in der falschen Richtung durchgegangen.

Trotzdem Danke für die zahlreichen "Anregungen"