
mi esfuerzo es
\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}
¿Cómo puedo dibujar esta representación de números binarios en tikz como el tipo de nodo de cuadro 3D? Gracias
Respuesta1
Esta parece una imagen razonable para el número binario 1111111
, pero para un número binario como 101010111
creo que la imagen debería ser:
El siguiente código define una macro \BinaryNumber
que acepta una lista de dígitos binarios separados por comas. Una vez definido esto, puedes utilizar
\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}
para producir:
Aquí está el código. Te explico un poco cómo funciona a continuación:
\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}
La idea principal es utilizar a pic
para dibujar cada byte (consulte la sección 18.2 delTikZmanual). La foto, llamada byte cube
lleva dos argumentos: {0 or 1, exponent}
. La imagen dibuja el "cubo de bytes" con el color de relleno debajo del número configurado en el estilo correspondiente de cube 0
o cube 1
. Cambiar estos estilos cambiará el sombreado debajo del número. (Entonces, por diseño, la elección del estilo depende del dígito binario).
La definición de \BinaryNumber
primero recorre los bytes para determinar la "longitud" del número binario y luego los recorre nuevamente para dibujar cada "cubo de bytes". Cada cubo de bytes sucesivo dibuja sobre aquellas partes de los cubos anteriores que "no queremos". En consecuencia, aunque el sombreado del lado derecho se dibuja para cada cubo, sólo es visible para el cubo situado más a la derecha.
Respuesta2
Una primera solución fácil puede ser la siguiente:
\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}