shift vs. and

Ich will das höchstwertige Bit eines uint64_t bestimmen.

uint64_t arr64;

void setup() {

  byte hw; // höchstwertiges Bit
  // mit shift
  hw = arr64 >> 63;
  // oder mit &
  hw = arr64 & 0x8000000000000000 ? 1 : 0;

}

void loop() {}

Welche Variante haltet Ihr für günstiger auf AVR?

Gruß Tommy

In diesem Fall ist mir im Grunde egal, welche Schreibweise benutzt wird. Bei beidem muss ich so „sehr“ analysieren, was es letztendlich bedeutet, dass es mich ablenkt. Ich halte einen passenden Kommentar für das Beste.

Gruß

Gregor

PS: Evtl. verstehe ich Dich falsch - was meinst Du mit „günstiger“? Lesbarkeit oder Prozessorlast/Ausführungszeit?

Günstiger bezüglich Prozessorlast/Ausführungszeit.
Der Kommentar steht doch dabei.

Gruß Tommy

Tommy56:
Günstiger bezüglich Prozessorlast/Ausführungszeit.

Dann sieh Dir doch den erzeugten Assembler-Code an. Dann kannste Takte zählen.

Gruß

Gregor

PS: Assembler-Code erzeugen:

avr-objdump --disassemble --source --line-numbers --demangle --section=.text foo.elf

Danke, ich hatte die falschen Parameter.
Danach ist wohl die erste Variante etwas schneller.

Gruß Tommy

Ich habe noch eine schnellere:

// höchstwertiges Bit = 
//                nur höchstwertiges Byte testen
byte hw1 = *((byte *)&arr64+7) & 0x80 ? 1 : 0;

Gruß Tommy

((byte*)&arr64)[7]

Array-Schreibweise finde ich da lesbarer.

Ja, stimmt.

Gruß Tommy

Hi

Dort musst Du dann aufpassen, wenn die Endians anders herum gestrickt sind.
Die Fehlerquelle solltest Du nicht haben, wenn Du mit der Zahl rechnest oder die Bits schiebst.

MfG

Ja, da man aber in der Regel in einem "Ökosystem" bleibt, ist das eigentlich kein Problem.

Gruß Tommy

Hi

Ok - wollte Das nur nebenher erwähnt haben.
Ruck zuck liegt man auf der Schnauze und weiß gar nicht, wie's dazu kommen konnte :wink:
Auch könnten die zu prüfenden Daten von einem befreundetem Ökosystem stammen - aber Da wirst Du Dich wohl besser mit auskennen, als ich.
Mir kam bisher nur Little-Endian unter, wobei ich Das eh als das 'gelungenere Ökosystem' ansehe - aber jetzt schweifen wir langsam in Glaubens-Regionen ab g

MfG

Die Routine ist Bestandteil einer Designstudie für einen Kometen über Schieberegister. Quasi ein Bit-Schieben aus einem uint64_t in ein uint16_t.

Gruß Tommy