Calc-Zellen als hexadezimale Zahlen interpretieren und umrechnen

Hallo,

mit LiO kann man dezimale Zahlen in hexadezimale Zahlen umwandeln (Befehl Basis), aber wie geht das umgekehrt? Ich habe hier eine Reihe hexadezimaler Zahlen, die ich gerne umwandeln möchte. Dazu muss Calc erstmal wissen, dass die Texte "7A" etc. überhaupt als Zahlen zu interpretieren sind...

Danke für Tipps,
Micha

Hallo Micha,

mit LiO kann man dezimale Zahlen in hexadezimale Zahlen umwandeln
(Befehl Basis)

Wirklich? Ich würde sagen, das macht die Funktion =DEZINHEX()

aber wie geht das umgekehrt?

Mit der Funktion =HEXINDEZ()

Gruß

Stefan

Stefan Weigel schrieb:

Wirklich? Ich würde sagen, das macht die Funktion =DEZINHEX()

Geht sicher auch...!

aber wie geht das umgekehrt?

Mit der Funktion =HEXINDEZ()

Danke!

Jetzt brauche ich noch einen Befehl, um die Dits zu verdrehen: aus 1 eine 0 und aus 0 eine 1!

Micha

Da fällt mir spontan =WECHSELN() ein.

Zum Beispiel so:

=WECHSELN(WECHSELN(WECHSELN(A1;"0";"x");"1";0);"x";"1")

Das verwandelt 1010 in 0101. Geht vielleicht auch eleganter.

Gruß

Stefan

=RECHTS(DEZINBIN(-BININDEZ(A1)-1);LÄNGE(A1))

Das wandelt die Binärdarstellung in A1 in einen Dezimalwert um. Dieser
wird dann negiert, und noch 1 davon abgezogen[1]. Das Ergebnis wird nun
wieder in eine Binärdarstellung umgewandelt, und schließlich auf die
passende Länge gekürzt.

Aber ob das wirklich eleganter ist, wage ich zu bezweifeln.

[1] Hintergrund dieser Rechenoperation ist, daß bei Zahlen der negative
Wert immer als Zweierkomplement darstellt wird, während eine bitweise
Invertierung das Einerkomplement bedeutet. Das Zweierkomplement von z.
B. -1 (also der negative Wert von bin 00000101) ist hexadezimal FF,
binär 11111111; das wäre aber das Einerkomplement von 0. Um auf das von
Dir gesuchte Einerkomplement für -1, also 11111110, zu kommen, musst Du
vom Zweierkomplement nochmal den Wert 1 abziehen.

Wolfgang

Hallo Wolfgang, Stefan, *

=RECHTS(DEZINBIN(-BININDEZ(A1)-1);LÄNGE(A1))

Das wandelt die Binärdarstellung in A1 in einen Dezimalwert um. Dieser
wird dann negiert, und noch 1 davon abgezogen[1]. Das Ergebnis wird
nun wieder in eine Binärdarstellung umgewandelt, und schließlich auf
die passende Länge gekürzt.

Aber ob das wirklich eleganter ist, wage ich zu bezweifeln.

Ich hätte noch eine Lösung über den Dezmalwert (passende
2er-Potenz-1-Zahl) anzubieten, die ist aber auch nicht eleganter...

Was mich etwas wundert: Es gibt eine BITOR()- und eine BITAND()-
Funktion aber das "BITNOT()" muss man sich über das Komplement selber
basteln...

Gruß,
Michael

=RECHTS(DEZINBIN(-BININDEZ(A1)-1);LÄNGE(A1))

Das wandelt die Binärdarstellung in A1 in einen Dezimalwert um. Dieser
wird dann negiert, und noch 1 davon abgezogen[1]. Das Ergebnis wird
nun wieder in eine Binärdarstellung umgewandelt, und schließlich auf
die passende Länge gekürzt.

Aber ob das wirklich eleganter ist, wage ich zu bezweifeln.

Ich hätte noch eine Lösung über den Dezmalwert (passende
2er-Potenz-1-Zahl) anzubieten, die ist aber auch nicht eleganter...

Was mich etwas wundert: Es gibt eine BITOR()- und eine BITAND()-
Funktion

Stimmt; an die hab ich gar nicht gedacht.

aber das "BITNOT()" muss man sich über das Komplement selber
basteln...

Ein 'BITNOT(Zahl)' ist nix anderes als 'BITXOR(Zahl;0)' (0 xor 0 = 1,
und 1 xor 0 = 0).

Das bringt aber trotzdem nicht wirklich viel, wenn der Wert als String
vorliegt (was ziemlich wahrscheinlich ist, da es meines Wissens keine
Möglichkeit gibt, eine Zahl /direkt/ in Hexadezimal- oder Binärform
darzustellen). Einen String muss man tortzdem zuerst in eine Zahl und
nachher wieder zurück verwandeln:

=RECHTS(DEZINBIN(BITXOR(BININDEZ(A1);0));LÄNGE(A1))

Wahrscheinlich könnte man auch was mit RegEx-Ausdrücken machen, aber
ich fürchte, daß das höchstens /noch/ uneleganter sein wird.

Wolfgang

Hallo Wolfgang,

> Was mich etwas wundert: Es gibt eine BITOR()- und eine BITAND()-
> Funktion

Stimmt; an die hab ich gar nicht gedacht.

> aber das "BITNOT()" muss man sich über das Komplement selber
> basteln...

Ein 'BITNOT(Zahl)' ist nix anderes als 'BITXOR(Zahl;0)' (0 xor 0 = 1,
und 1 xor 0 = 0).

Da hast du allerdings recht. Aber s.u.:

Das bringt aber trotzdem nicht wirklich viel, wenn der Wert als String
vorliegt (was ziemlich wahrscheinlich ist, da es meines Wissens keine
Möglichkeit gibt, eine Zahl /direkt/ in Hexadezimal- oder Binärform
darzustellen). Einen String muss man tortzdem zuerst in eine Zahl und
nachher wieder zurück verwandeln:

Ich gebe häufig Mathe-Nachhilfe und dabei geht es gelegentlich auch um
Zahlensysteme und (Rechen-)Logik.

Der "klassische" Start ist die Erklärung von NOT, AND und OR. Im
weiteren Verlauf nutze ich gerne mal eine Tabellenkalkulation ein.
Dabei arbeite ich bei diesem Thema zweizeilig: Oben die Binärzahlen als
Text, unten die Dezimalwerte.

Es ist dann leicht störend, dass ich nicht mit den zuerst eingeführten
Funktionen arbeiten kann, sondern für NOT entweder über das Komplement,
oder (wie du vorgeschlagen hast) über XOR gehen muss.

In diesem Zusammenhang wäre auch eine BITNAND-Funktion ganz nützlich,
um zu zeigen, dass man sogar die drei Grundfunktionen auf eine einzige
zurückführen kann.

Gruß,
Michael

Wolfgang Jäth schrieb:

> =RECHTS(DEZINBIN(BITXOR(BININDEZ(A1);0));LÄNGE(A1))

Danke, ich habe die Zahlen dezimal vorliegen, da genügt also ein einfaches BITXOR(A1,255) - ein xor mit 0 ändert nichts.

Jetzt geht es aber weiter: Ich brauche ein bitweises SHIFT. OK, ich hab erstmal selbst gesucht und BITLSHIFT gefunden. Aber wo kann ich angeben, von wie vielen Binärstellen ausgegangen wird.

Warum wird im Beispiel
"BITLSHIFT(6;1) ergibt 12" davon ausgeganen, dass die 6 als 0110 zu interpretieren ist und nicht als 00000110? Hier wäre das Ergebnis gleich, aber wenn ich 6 mit nur drei Stellen angebe (110) wird beim SHIFT 101 daraus, also eine 5...

Ich benötige eine Interpretation in 8 Bits!

Danke für weitere Hilfe,
Micha

Hallo Micha,

Danke, ich habe die Zahlen dezimal vorliegen, da genügt also ein
einfaches BITXOR(A1,255) - ein xor mit 0 ändert nichts.

Ja, da hat er sich vertan: 1 xor 1 = 0 ; 0 xor 1 = 1.

Jetzt geht es aber weiter: Ich brauche ein bitweises SHIFT. OK, ich
hab erstmal selbst gesucht und BITLSHIFT gefunden. Aber wo kann ich
angeben, von wie vielen Binärstellen ausgegangen wird.

Warum wird im Beispiel
"BITLSHIFT(6;1) ergibt 12" davon ausgeganen, dass die 6 als 0110 zu
interpretieren ist und nicht als 00000110? Hier wäre das Ergebnis
gleich, aber wenn ich 6 mit nur drei Stellen angebe (110) wird beim
SHIFT 101 daraus, also eine 5...

Das sehe ich anders: bei einfachen "shiften" müsste aus "110" eine
"100" werden. Die shift-Funktion entspricht einer Multiplikation bzw
einer Division(ohne Rest) mit/durch 2.

Du könntest das "Abschneiden" von n Stellen durch ein BITAND()
erreichen. Bei drei stellen eben:

  BITAND(BITLSHIFT(6;1);7)

In Binärschreibweise:

     BITAND(BITLSHIFT('110';1);'111')
  -> BITAND('1100';'111')
  -> '100'

Gruß,
Michael

Hi Michael, *,

[...]
In diesem Zusammenhang wäre auch eine BITNAND-Funktion ganz nützlich,
um zu zeigen, dass man sogar die drei Grundfunktionen auf eine einzige
zurückführen kann.

Du könntest die Funktion z.B. via Basic nachrüsten.

function BITNAND
  [das, was die Formel tun soll]
end function

https://help.libreoffice.org/Calc/User-Defined_Functions/de

ciao
Christian

Wolfgang Jäth schrieb:

> =RECHTS(DEZINBIN(BITXOR(BININDEZ(A1);0));LÄNGE(A1))

Danke, ich habe die Zahlen dezimal vorliegen, da genügt also ein
einfaches BITXOR(A1,255) - ein xor mit 0 ändert nichts.

<rotwerd> Ups, sorry; ja. Fehler Meinerseits. Natürlich lautet die
Logik: 1 xor 1 = 0 ; 0 xor 1 = 1. </rotwerd>

Jetzt geht es aber weiter: Ich brauche ein bitweises SHIFT. OK, ich hab
erstmal selbst gesucht und BITLSHIFT gefunden. Aber wo kann ich angeben,
von wie vielen Binärstellen ausgegangen wird.

Laut https://help.libreoffice.org/Calc/Bit_Operation_Functions#BITLSHIFT
von maximal 48.

Warum wird im Beispiel
"BITLSHIFT(6;1) ergibt 12" davon ausgeganen, dass die 6 als 0110 zu
interpretieren ist und nicht als 00000110?

Diesen Satz verstehe ich nicht; 0110 << 1 = 1100 aka 12, und 00000110 <<
1 = 00001100 aka 12.

Hier wäre das Ergebnis
gleich, aber wenn ich 6 mit nur drei Stellen angebe (110) wird beim
SHIFT 101 daraus, also eine 5...

Das halte ich für sinnvoll; wenn Du den zu shiftenden Wert explizit mit
weniger Stellen an gibst (wobei ich mich frage, wie Du das bei einer
Zahl überhaupt schaffst), dann sollte natürlich auch das Ergebnis auf
diese kleinere Stellenanzahl begrenzt werden.

Ich benötige eine Interpretation in 8 Bits!

Dann musst Du im Zweifelsfall auch einen 8-Bit-Wert übergeben.

Wolfgang

Michael Höhne schrieb:

Das sehe ich anders: bei einfachen "shiften" müsste aus "110" eine
"100" werden. Die shift-Funktion entspricht einer Multiplikation bzw
einer Division(ohne Rest) mit/durch 2.

OK, danke für die Aufklärung. Das steht letztlich ja auch so in der LibO-Hilfe. Ich brauchte allerdings ein "Verdrehen" der Bits, also ein anhängen der ersten drei Bits an den nach vorne geschobenen Rest. Hierfür ist die Länge in Bits wichtig, bei mir sind es 8 Bits.

Das habe ich jetzt per Rechnung erledigt:
=(A1-QUOTIENT(A1;32)*32)*8 + QUOTIENT(A1;32)

- keine weiteren Fragen dazu -

Micha

Hallo Christian,

Du könntest die Funktion z.B. via Basic nachrüsten.

function BITNAND
  [das, was die Formel tun soll]
end function

https://help.libreoffice.org/Calc/User-Defined_Functions/de

Wäre eine Möglichkeit. Ich wundere mich nur manchmal über die Auswahl
der Funktionen.

Wie ich schrieb: Ich verwende Calc/Excel/Turbocalc/Sheets/... sehr
gerne im Mathe-Nachhilfeunterricht. Man kann prima die Arbeitsweise von
Algorithmen zeigen, Tabellen erstellen oder Kurvendiskussion
"plastisch" darstellen...

Dabei gibt es Funktionen, die ich zum "Standard-Repertoire" zählen
würde, wie etwa AND/OR/NOT bei den Logik-Funktionen. Leider sind sich
die verschiedenen Tabellenkalkulationen da nicht so ganz einig :wink:

Bei den "Taschenrechner"-Programmen sieht es da anders aus. das mag der
Tatsache geschuldet sein, dass Tabellenkalkulationen zu Beginn eher für
Wirtschafts-Berechnungen genutzt wurden.

Ich habe im Augenblick einfach zu wenig Zeit, aber in meinem nächsten
Urlaub werde ich mal ein paar Wünsche als Issue aufgeben...

Gruß,
Michael

Hallo Wolfgang,

Hier hat Micha Kuehn offenbar zwei Operationen verwechselt:

> Warum wird im Beispiel
> "BITLSHIFT(6;1) ergibt 12" davon ausgeganen, dass die 6 als 0110 zu
> interpretieren ist und nicht als 00000110?

Diesen Satz verstehe ich nicht; 0110 << 1 = 1100 aka 12, und 00000110
<< 1 = 00001100 aka 12.

> Hier wäre das Ergebnis
> gleich, aber wenn ich 6 mit nur drei Stellen angebe (110) wird beim
> SHIFT 101 daraus, also eine 5...

Es gibt einmal die "klassische" SHIFT-Operation, die einfach nur eine
Multiplikation mit Zwei darstellt, was durch "Anfügen einer Null"
beschrieben werden kann.

Das andere ist das, was ich als "circular shift" oder auch
"roll/rotate" kenne: Hier wird das höchste Bit nach dem SHIFT in die
niedrigste Position geschoben. Dabei ist die Breite der Zahl wichtig:

  1101 -> [1]101 -> 101[1] -> 1011

  00001101 -> [0]0001101 -> 0001101[0] -> 00011010

Eine Möglichkeit (bei 3 Stellen): AND(ZAHL;4)/4+BITLSHIFT(ZAHL)

Mit dem ersten AND prüfst du darauf, ob das erste Bit gesetzt ist und
ziehst es an die dritte Stelle ( /4 ). Anschließend führst du das
LSHIFT durch und hängst die vormals 1. Ziffer hinten an.

Gruß,
Michael

Wie ich schrieb: Ich verwende Calc/Excel/Turbocalc/Sheets/... sehr
gerne im Mathe-Nachhilfeunterricht. Man kann prima die Arbeitsweise von
Algorithmen zeigen, Tabellen erstellen oder Kurvendiskussion
"plastisch" darstellen...

Dabei gibt es Funktionen, die ich zum "Standard-Repertoire" zählen
würde, wie etwa AND/OR/NOT bei den Logik-Funktionen. Leider sind sich
die verschiedenen Tabellenkalkulationen da nicht so ganz einig :wink:

Das liegt wohl hauptsächlich daran, daß Calc primär ein
Tabellenkalkulationsprogramm ist, und somit eher [tm] aus der
Wirtschaftswelt stammt, während logische Verknüpfungen eindeutig aus der
wissenschaftlich-technischen Ecke stammen (und selbst da nur eine sehr
spezielle Ecke besetzen; sieht man leicht daran, daß auch viele eher
technisch Orientierte bei boolescher Logik schnell überfordert sind).

Bei den "Taschenrechner"-Programmen sieht es da anders aus.

Nur bei den wissenschaftlichen.

das mag der
Tatsache geschuldet sein, dass Tabellenkalkulationen zu Beginn eher für
Wirtschafts-Berechnungen genutzt wurden.

Und immer noch werden.

Wolfgang

Das kenne ich eigentlich nur als ROL (Rotate Left) oder ROR (Rotate
Right) bzw. RCL/RCR (Rotate with Carry-Flag Left/Right); aber nicht als
Shift.

Wolf 'aber mit dem Carry-Flag kann sowieso nur auf Assembler-Ebene was
anfangen' gang