20

I am translating a C++ program into pseudo-code using the algorithmicx package.

Do you know how I can represent the C bitwise operator like the shifts (<< and >>) ?

Until now I used power of 2 but it's not very convenient.

4
  • Can you please explain what you mean by "I used power of 2"? Mar 25, 2011 at 11:04
  • @Hendrik: Apparently x \cdot 2^n and x / 2^n, where n is the shift amount. Mar 25, 2011 at 11:08
  • @Andrey: Thanks, now I get it - in pseudo-code that's not too bad. Mar 25, 2011 at 11:26
  • @HendrikVogt: Notice that << behaves differently than power when running out of bits.
    – user877329
    Feb 16, 2015 at 12:18

5 Answers 5

13

Pseudocode has a different purpose compared to the actual programs. It should convey ideas, not implementation, and as such should be as close to the natural language as possible. Therefore I think it's not good to introduce programming language-specific syntax in the algorithm listing.

I suggest one of these options:

  • continue using algorithmicx and select a human-readable name for the operation: \State $x \gets \Call{ShiftLeft}{x, 3}$;
  • use the listings package and typeset the actual C++ program with comments.
1
  • Ok I will use the Call (I didn't know it).
    – BenjaminB
    Mar 25, 2011 at 11:45
23

I advise against Andrey’s solution. He is right that in general pseudocode should be independent of a specific machine or language.

But this breaks down with bit operations. Bit operations do suggest a specific underlying architecture, and the bit operators follow an established nomenclature.

You don’t make the code more readable by ignoring this convention – in fact, you do the opposite.

I have the following commands defined in my thesis template:

\newcommand*\BitAnd{\mathbin{\&}}
\newcommand*\BitOr{\mathbin{|}}
\newcommand*\ShiftLeft{\ll}
\newcommand*\ShiftRight{\gg}
\newcommand*\BitNeg{\ensuremath{\mathord{\sim}}}

(The command names follow the naming convention of the algorithmicx package which I can recommend for typesetting algorithms.)

That said, you should second-guess your reason for using bit operations in the first place – often they are only used to achieve specific optimisations, in which case they have no place in a pseudo-code. On the other hand, sometimes (and it sounds as if this may be the case for you) they have a legitimate purpose.

4
  • 1
    I agree that your point is valid. A yet better approach would be to use the C-style notation and add a list of operators and their meanings somewhere in the beginning of the document. This eliminates any possible confusion. Jul 23, 2011 at 9:32
  • How about \BitXor? I tried \newcommand{\BitXor}{\mathrel{\^}} and it's giving me problems (in MathJax, maybe something strange there, but the other commands worked (non-starred) )
    – Nick T
    Nov 24, 2015 at 15:43
  • @NickT See tex.stackexchange.com/q/77646/42. Nov 24, 2015 at 16:24
  • 1
    It seems \mathbin is more appropriate than \mathrel.
    – xskxzr
    Apr 14, 2019 at 11:27
11

For symbols, you can use \ll and \gg for shifting, and \lll, \ggg for rotating.

\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}

enter image description here

You can also define some functions:

\usepackage{amsmath}
\DeclareMathOperator\shl{shl}% shift left
\DeclareMathOperator\shr{shr}% shift right
\DeclareMathOperator\rol{rol}% rotate left
\DeclareMathOperator\ror{ror}% rotate right

and use $\shl(a,n)$ etc. in the algorithm.

5
  • \ll and \gg means more "very lower" and "very greater" rather than bit level shift.
    – BenjaminB
    Mar 25, 2011 at 11:06
  • @Ubiquité: Yes, I know that. But they are actully used in some algorithm descriptions, especially in figures. For example, en.wikipedia.org/wiki/SHA-1
    – Leo Liu
    Mar 25, 2011 at 11:17
  • Plus, in the 'normal' representation of the programming construct, they are not, I think, kerned. Mar 25, 2011 at 13:34
  • @Brent But they look better when kerned. Pretty-printed pseudo-code can take some freedom with operators. Many authors do this and in some cases (Haskell and ML come to mind) this is actually encouraged and something of a standard. Mar 25, 2011 at 15:10
  • @Konrad: Knuth's WEB comes to mind too. weave tex.web and then run pdftex tex.
    – TH.
    Mar 25, 2011 at 20:31
4

Use the \verb command, e. g.

\verb|<<|

and

\verb|>>|

if you need to have those operators displayed exactly as they would be typed in a program, and do not want to use other packages for that.

4

In mathematics \ll is often used for "much less than" and using both in one document creates a need to distinguish this symbol from the bit shift operator.

My suggestion is to combine the answers of Konrad and PointedEars thusly:

\DeclareMathOperator\ShiftLeft{\texttt{<<}}% shift left

The \verb command is overpowered for this purpose and has some restrictions which make it harder to work with. I use \texttt{<<} instead, as it may more easily be included into macros. It's also a good idea to make a macro out of whatever you settle on, so in the future you only have to change it in one place if you change your mind.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.