
Mein Bemühen ist
\documentclass[margin=1in]{standalone}
\usepackage{tikz}
\usetikzlibrary[arrows, decorations.pathmorphing, backgrounds, positioning, fit, petri]
\begin{document}
\begin{tikzpicture}[node distance=0pt,
box/.style={draw, minimum size=1cm, inner sep=0.5cm},
value/.style={yshift=-1cm}]
\node[box] (b7) {1};
\node[box] (b6) [right=of b7] {1};
\node[box] (b5) [right=of b6] {1};
\node[box] (b4) [right=of b5] {1};
\node[box] (b3) [right=of b4] {1};
\node[box] (b2) [right=of b3] {1};
\node[box] (b1) [right=of b2] {1};
\node[box] (b0) [right=of b1] {1};
\node[value] [below of=b0] {$2^0$};
\node[value] [below of=b1] {$2^1$};
\node[value] [below of=b2] {$2^2$};
\node[value] [below of=b3] {$2^3$};
\node[value] [below of=b4] {$2^4$};
\node[value] [below of=b5] {$2^5$};
\node[value] [below of=b6] {$2^6$};
\node[value] [below of=b7] {$2^7$};
\end{tikzpicture}
\end{document}
Wie kann ich diese Binärzahlendarstellung in Tikz wie einen 3D-Boxknotentyp zeichnen? Danke
Antwort1
Dies scheint ein sinnvolles Bild für die Binärzahl zu sein, 1111111
aber für eine Binärzahl wie 101010111
diese sollte das Bild meiner Meinung nach folgendermaßen aussehen:
Der folgende Code definiert ein Makro \BinaryNumber
, das eine durch Kommas getrennte Liste von Binärziffern akzeptiert. Sobald dies definiert ist, können Sie verwenden
\BinaryNumber{1,1,1,1,1,1,1,1,1}
\BinaryNumber{1,0,1,0,1,1,1}
\BinaryNumber{1,0,1,1,1,0,1,0,0,1,1}
produzieren:
Hier ist der Code. Ich erkläre unten ein wenig, wie er funktioniert:
\documentclass{article}
\usepackage{tikz}
\tikzset{
pics/byte cube/.style args = {#1,#2}{
code = {
\draw[fill=white] (0,0) rectangle (1,1);
\node at (0.5,0.5){#1};
\draw[cube #1] (0,0)--(-60:2mm)--++(1,0)--++(0,1)--++(120:2mm)--(1,0)--cycle;
\draw(1,0)--++(-60:2mm);
\node at (0.5,-0.5){$2^{#2}$};
}
},
cube 1/.style = {fill=gray!30}, % style for bytes that are "on"
cube 0/.style = {fill=white}, % style for bytes that are "off"
}
\newcommand\BinaryNumber[1]{%
\begin{tikzpicture}
% count the number of bytes and store as \C
\foreach \i [count=\c] in {#1} { \xdef\C{\c} }
\foreach \i [count=\c, evaluate=\c as \ex using {int(\C-\c)}] in {#1} {
\pic at (\c, 1) {byte cube={\i,\ex}};
}
\end{tikzpicture}
}
\begin{document}
\BinaryNumber{1,1,1,1,1,1,1,1,1} \bigskip
\BinaryNumber{1,0,1,0,1,1,1} \bigskip
\BinaryNumber{1,0,1,1,1,0,1,0,0,1,1} \bigskip
\end{document}
Die Grundidee besteht darin, pic
jedes Byte mit einem zu zeichnen (siehe Abschnitt 18.2 desTikZHandbuch). Das aufgerufene Bild byte cube
nimmt zwei Argumente an: {0 or 1, exponent}
. Das Bild zeichnet den „Bytewürfel“ mit der Füllfarbe unter der Zahl, die auf den entsprechenden Stil von cube 0
oder eingestellt ist cube 1
. Wenn Sie diese Stile ändern, ändert sich die Schattierung unter der Zahl. (Die Wahl des Stils hängt also konzeptgemäß von der Binärziffer ab.)
Die Definition \BinaryNumber
durchläuft zuerst die Bytes, um die „Länge“ der Binärzahl zu bestimmen, und durchläuft sie dann erneut, um jeden „Bytewürfel“ zu zeichnen. Jeder nachfolgende Bytewürfel überschreibt die Teile der vorherigen Würfel, die wir „nicht wollen“. Folglich ist die Schattierung auf der rechten Seite, obwohl sie für jeden Würfel gezeichnet wird, nur für den Würfel ganz rechts sichtbar.
Antwort2
Eine erste einfache Lösung kann die folgende sein:
\documentclass[margin=1in]{standalone}
\usepackage{tikz}
\usetikzlibrary[arrows, decorations.pathmorphing, backgrounds, positioning, fit, petri]
\begin{document}
\begin{tikzpicture}[node distance=0pt,
box/.style={draw, minimum size=1cm, inner sep=0.5cm},
value/.style={yshift=-1cm}]
\node[box] (b7) {1};
\node[box] (b6) [right=of b7] {1};
\node[box] (b5) [right=of b6] {1};
\node[box] (b4) [right=of b5] {1};
\node[box] (b3) [right=of b4] {1};
\node[box] (b2) [right=of b3] {1};
\node[box] (b1) [right=of b2] {1};
\node[box] (b0) [right=of b1] {1};
\def\xasn{1mm}% x direction of the box
\def\yasn{-1.5mm}% y direction of the box
\fill[lightgray] (b0.north east) -- ([shift={(\xasn,\yasn)}]b0.north east) -- ([shift={(\xasn,\yasn)}]b0.south east) -- (b0.south east);
\draw (b0.north east) -- ([shift={(\xasn,\yasn)}]b0.north east) -- ([shift={(\xasn,\yasn)}]b0.south east);
\foreach \boxnr in {0,1,...,7} {
\draw[fill=lightgray] (b\boxnr.south west) -- +(\xasn,\yasn) -- ([shift={(\xasn,\yasn)}]b\boxnr.south east) -- (b\boxnr.south east);
}
\node[value] [below of=b0] {$2^0$};
\node[value] [below of=b1] {$2^1$};
\node[value] [below of=b2] {$2^2$};
\node[value] [below of=b3] {$2^3$};
\node[value] [below of=b4] {$2^4$};
\node[value] [below of=b5] {$2^5$};
\node[value] [below of=b6] {$2^6$};
\node[value] [below of=b7] {$2^7$};
\end{tikzpicture}
\end{document}