我正在使用该包将 C++ 程序翻译成伪代码algorithmicx
。
您知道如何表示 C 位运算符(例如移位(<< 和 >>))吗?
到目前为止我使用了 2 的幂,但它不是很方便。
答案1
伪代码与实际程序的用途不同。它应该传达想法,而不是实现,因此应该尽可能接近自然语言。因此,我认为在算法列表中引入特定于编程语言的语法并不好。
我建议选择以下选项之一:
- 继续使用
algorithmicx
并为操作选择一个人类可读的名称:\State $x \gets \Call{ShiftLeft}{x, 3}$
; - 使用
listings
对实际的 C++ 程序进行打包和排版,并附带注释。
答案2
我不建议使用 Andrey 的解决方案。他说得对,伪代码通常应该独立于特定机器或语言。
但使用位运算则不行。位运算做建议特定的底层架构,并且位运算符遵循既定的命名法。
忽略这个约定并不能让代码更易读——事实上,你做的恰恰相反。
我的论文模板中定义了以下命令:
\newcommand*\BitAnd{\mathbin{\&}}
\newcommand*\BitOr{\mathbin{|}}
\newcommand*\ShiftLeft{\ll}
\newcommand*\ShiftRight{\gg}
\newcommand*\BitNeg{\ensuremath{\mathord{\sim}}}
(命令名称遵循algorithmicx
我可以推荐用于排版算法的包的命名约定。)
话虽如此,您首先应该重新考虑使用位运算的原因——通常它们仅用于实现特定的优化,在这种情况下它们不适合用于伪代码。另一方面,有时(听起来您就是这种情况)它们有合法的用途。
答案3
对于符号,您可以使用\ll
和\gg
进行移动\lll
,\ggg
使用 进行旋转。
\documentclass{article}
\usepackage{amssymb}
\begin{document}
$a\land b$, $a\lor b$, $\lnot a$, $a\oplus b$
$a\ll b$, $a\gg b$, $a\lll b$, $a\ggg b$
\end{document}
您还可以定义一些函数:
\usepackage{amsmath}
\DeclareMathOperator\shl{shl}% shift left
\DeclareMathOperator\shr{shr}% shift right
\DeclareMathOperator\rol{rol}% rotate left
\DeclareMathOperator\ror{ror}% rotate right
$\shl(a,n)$
并在算法中使用等等。
答案4
在数学中\ll
通常用于表示“远小于”,并且在一个文档中同时使用这两个符号需要将此符号与位移运算符区分开来。
我的建议是将 Konrad 和 PointedEars 的答案结合起来:
\DeclareMathOperator\ShiftLeft{\texttt{<<}}% shift left
\verb 命令的功能过于强大,并且有一些限制,使其更难使用。我改用它\texttt{<<}
,因为它可能更容易包含在宏中。根据你确定的内容制作宏也是一个好主意,这样以后如果你改变主意,只需在一个地方更改它即可。