二进制算术

二进制算术

是否有一个包可以执行二进制算术,如加法、减法等?例如:1101 + 0001 = 1110。

但不是像我在这里输入的文本!

另外,除了脫位用于十进制算术运算?

答案1

pgf可以使用内置的数学函数:

在此处输入图片描述

笔记:

  • 0b前缀为或 的整数0B被解释为二进制数,并自动转换为十进制数。因此前缀为0b#1 + 0b#2。应该注意的是,将以 开头的数字0视为八进制数这一特性可以不是按照 Martin Scharrer 的回答禁用pgfmath 函数使用以 0 为前导的数字时产生意外结果

  • \pgfmathbin{x}将整数转换为二进制表示形式。

  • \pgfmathprintnumber是可选的,用于格式化数字。在这种情况下,它会自动检测加法的十进制值是否为整数,并生成 ,102而不是102.0像第一个十进制加法那样。

代码:

\documentclass{article}
\usepackage{pgf}
\newcommand{\BinaryAdd}[2]{%
    {#1}_2 + {#2}_2 = \pgfmathbin{0b#1 + 0b#2}% compute binary addition
    \pgfmathresult_2% format output to make it clear it is base 2
}%
\newcommand{\BinarySub}[2]{%
    {#1}_2 - {#2}_2 = \pgfmathbin{0b#1 - 0b#2}% compute binary subtraction
    \pgfmathresult_2% format output to make it clear it is base 2
}%

\newcommand{\DecimalAdd}[2]{%
    #1 + #2 = \pgfmathparse{#1 + #2}%    compute addition
    \pgfmathprintnumber{\pgfmathresult}% format output
}%
\newcommand{\DecimalSub}[2]{%
    #1 - #2 = \pgfmathparse{#1 - #2}%    compute subtraction
    \pgfmathprintnumber{\pgfmathresult}% format output
}%
\begin{document}
$\BinaryAdd{101}{0001}$\par
$\BinarySub{101}{0001}$

\bigskip
$\DecimalAdd{101}{0001}$\par
$\DecimalSub{101}{0001}$
\end{document}

答案2

fmtcount包裹允许各种计数器格式选项,包括将十进制值打印为二进制(如果需要,带有一些前导零)。

以下最小示例以宽度的二进制形式提供\binnum[<width>]{<num>}打印(默认值为),并允许进行计算。为了获得适当的间距,应在数学模式下使用它:<num><width>4

在此处输入图片描述

\documentclass{article}
\setlength{\textwidth}{400pt}% Just for this example
\usepackage{fmtcount}% http://ctan.org/pkg/fmtcount
\newcounter{mycounter}%
\newcommand{\binnum}[2][4]{%
  \setcounter{mycounter}{\numexpr #2\relax}%
  \padzeroes[#1]{\binary{mycounter}}%
}
\begin{document}
$13+1=\binnum{13}_2+\binnum{1}_2=\binnum{13+1}_2$ \par
$1+2+4+8+16+32=\binnum{1}_2+\binnum{2}_2+\binnum{4}_2+\binnum{8}_2+\binnum{16}_2+\binnum{32}_2=\binnum[8]{1+2+4+8+16+32}_2$
\end{document}​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

如果您有兴趣,可以使用这个更新版本,它定义了 的带星号版本\binnum[*][<width>]{<num>}。默认值与未带星号的版本相同,也打印基数 (2)。带星号的版本不打印基数:

\usepackage{xparse}% http://ctan.org/pkg/xparse
\NewDocumentCommand{\binnum}{s O{4} m}{%
  \setcounter{mycounter}{\numexpr #3\relax}%
  \padzeroes[#2]{\binary{mycounter}}\IfBooleanTF{#1}{}{_2}%
}

xparse提供命令定义接口。

答案3

与往常一样,我建议TikZ

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}

\begin{document}

\newcommand{\ci}[1]{\pgfmathparse{#1}\pgfmathresult}

\pgfmathsetmacro{\numa}{33.5}
\pgfmathsetmacro{\numb}{15.4}
\begin{tabular}{|l|r|r|r|r|} \hline
 & add & sub & mult & div \\
decimal & \ci{\numa+\numb} & \ci{\numa-\numb} & \ci{\numa*\numb} & \ci{\numa/\numb} \\ \hline
binary & \ci{bin(\numa+\numb)} & \ci{bin(\numa-\numb)} & \ci{bin(\numa*\numb)} & \ci{bin(\numa/\numb)} \\ \hline
\end{tabular}
\end{document}

在此处输入图片描述

答案4

下面实现了一些使用基数2数字作为输入的函数:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:cpn {@binary} #1 { \int_to_binary:n { #1 } } % necessary for LaTeX2e infrastructure

\cs_new:Npn \binary_sum:nn #1 #2
  {
   \int_eval:n { \int_from_binary:n { #1 } + \int_from_binary:n { #2 } }
  }

\NewDocumentCommand{\evalbinsum}{ m m }
  {
   \int_to_binary:n { \binary_sum:nn {#1} {#2} }
  }

\NewDocumentCommand{\binsetcounter}{ m m }
  {
   \setcounter{#1}{\int_from_binary:n {#2}}
  }

\ExplSyntaxOff

\NewDocumentCommand{\showbinsum}{ m m }
  {
   #1_2 + #2_2 = \evalbinsum{#1}{#2}_2
  }

\makeatletter
\newcommand{\binary}[1]{\expandafter\@binary\csname c@#1\endcsname}
\makeatother

\begin{document}

$\showbinsum{1101}{0001}$ % show a sum of radix 2 numbers

\newcounter{mycnt}

\binsetcounter{mycnt}{11001} % set a counter using a radix 2 number

$\arabic{mycnt}=\binary{mycnt}_2$ % verification

\end{document}

通过\binary{mycnt}1 可以得到计数器值的基数2表示形式(类似于\arabic)。

相关内容