重新创建图形(摆弄箭头)

重新创建图形(摆弄箭头)

因此,我在网上找到了这张图片,以及一本书中的类似图片,并想在我的期末论文中重新创建它们。

在此处输入图片描述

我对 TikZ 不是很熟练,而且我总是在箭头和位置上挣扎。-.- 但我尝试过(至少):

\documentclass[tikz]{standalone}

\usepackage[T1]{fontenc}

\usepackage{tikz}
    \usetikzlibrary{calc}
    \usetikzlibrary{positioning}
    \usetikzlibrary{shapes.geometric}
    \usetikzlibrary{arrows}

\begin{document}
    \begin{tikzpicture}[
        >=stealth,
        node distance = 1.25cm,
        bit/.style = { rectangle, minimum width = .75cm, minimum height = .5cm, fill = gray!5, draw },
        arrow/.style = { -> }]

        \node[bit, label = below:$ 7 $](bit7){};
        \node[bit, right of = bit7, label = below:$ 6 $](bit6){};
        \node[bit, right of = bit6, label = below:$ 5 $](bit5){};
        \node[bit, right of = bit5, label = below:$ 4 $](bit4){};
        \node[bit, right of = bit4, label = below:$ 3 $](bit3){};
        \node[bit, right of = bit3, label = below:$ 2 $](bit2){};
        \node[bit, right of = bit2, label = below:$ 1 $](bit1){};
        \node[bit, right of = bit1, label = below:$ 0 $](bit0){};

        \draw [arrow] (bit7) -- (bit6);
        \draw [arrow] (bit6) -- (bit5);
        \draw [arrow] (bit5) -- (bit4);
        \draw [arrow] (bit4) -- (bit3);
        \draw [arrow] (bit3) -- (bit2);
        \draw [arrow] (bit2) -- (bit1);
        \draw [arrow] (bit1) -- (bit0);

    \end{tikzpicture}
\end{document}

正如你所看到的,它不是那么漂亮。——当我减少节点距离时,所有箭头看起来都很混乱,我找不到从 0 到 7 绘制有用箭头的方法。

在此处输入图片描述

至于 SWAP 图,我根本没有计划。:( 因此,如果能提供一点帮助我将非常感激。:)

答案1

我相信你会在这里找到其他解决方案。这是另一个。它使用 来matrix of nodes声明位单元。

列之间的分隔是用column sep选项声明的,但可以在所需列中使用[<increasing distance>]after进行修改&。这种可能性已在 RLCA 寄存器中使用,以在进位位和寄存器之间引入一定的距离。

默认情况下,matrix节点的名称为matrix name-row-column,但可以使用语法分配新名称|(name)|,正如您在两个矩阵的每个第二行中所看到的那样。

在第一个示例(RCA)中,寄存器标签被添加为matrix标签,但在 RLCA 中,标签在矩阵构建后被绘制为常规节点。它们不能作为标签包含在位节点中,因为它们的大小会修改单元之间的距离。

SWAP 寄存器也使用矩阵,但第二行的节点未绘制。之后使用两个节点定义高位和低位。使用合适的节点,其内容必须如下所示fit写入。label=center:...

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows.meta,fit}

\begin{document}
\begin{tikzpicture}[>=Stealth,
font=\ttfamily,
bits/.style={draw, minimum size=7mm},
register/.style={matrix of nodes,nodes={bits},
column sep=-\pgflinewidth, 
row sep=0.5mm, nodes in empty cells,
row 1/.style={nodes={draw=none, minimum size=5mm}},
}]

\matrix[register, label=below:RLA] (RLA) {
7 & 6 & 5 & 4 & 3 & 2 & 1 & 0\\
|(7)|&|(6)|&|(5)|&|(4)|&|(3)|&|(2)|&|(1)|&|(0)|\\};

\foreach \i in {0,...,7}
    \draw[->] ([xshift=1mm]\i.east)--++(180:4mm);
\draw[->] (7.west)--++(180:3mm);
\draw (7.west)--++(180:1cm)|-(RLA.north)-|([xshift=1cm]0.east)--(0.east);

\begin{scope}[yshift=-3cm]
\matrix[register] (RLCA) {
C &[5mm] 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0\\
|(C)| & |(7)|&|(6)|&|(5)|&|(4)|&|(3)|&|(2)|&|(1)|&|(0)|\\};

\node[below] at (C|-RLCA.south) {Carry flag};  
\node[below] at (4.east|-RLCA.south) {RLCA};

\foreach \i in {0,...,7}
    \draw[->] ([xshift=1mm]\i.east)--++(180:4mm);
\draw[->] (7)--(C);
\draw[->] (C.west)--++(180:3mm);
\draw (C.west)--++(180:1cm)|-(RLCA.north)-|([xshift=1cm]0.east)--(0.east);
\end{scope}

\begin{scope}[yshift=-6cm]
\matrix[register, row 2/.style={nodes={bits,draw=none}}] (SWAP) {
7 & 6 & 5 & 4 & 3 & 2 & 1 & 0\\
|(7)|&|(6)|&|(5)|&|(4)|&|(3)|&|(2)|&|(1)|&|(0)|\\};

\node[fit={(7.north west) (4.south east)}, inner sep=0pt, draw, label=center:High Nibble] (HN) {};  
\node[fit={(4.north east) (0.south east)}, inner sep=0pt, draw, label=center:Low Nibble] (LN) {};  

\draw (HN.south)--++(-90:3mm)-| (LN.south) node[pos=0.25, below] (swap) {SWAP A};
\draw [<->] (swap.north)+(-6mm,0)--++(0:6mm);
\end{scope}

\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

简短的部分解决方案:

\documentclass[tikz,border=7mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
  \begin{tikzpicture}
    \draw[scale=.5] let \n1={7} in grid (\n1+1,1) +(.5,1) rectangle (-.5,.5)
      [xshift=.5cm] foreach \i in {0,...,\n1}{ 
        (\n1-\i,1.5) node{\i} (\i+1,.5) edge[-latex] (\i,.5)};
  \end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容