是否有一个包可以执行二进制算术,如加法、减法等?例如: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
)。