Smalltalk(现在很认真),123118105(*)
很抱歉回答两次,但认为这是一个严肃的答案,而另一个回答更像是幽默。目前,实际上已经在我们所有的机器上执行了以下操作(尽管在硬件中)。奇怪的是,没有人想到...
通过组合两个半加法器,并并行处理单词的所有位,我们得到(输入a,b;以s输出)可读版本:
s := a bitXor: b.
c := (a & b)<<1.
[c ~= 0] whileTrue:[
cn := s & c.
s := s bitXor: c.
c := cn<<1.
c := c & 16rFFFFFFFF.
s := s & 16rFFFFFFFF.
].
s
该循环用于进位传播。掩码可确保处理带符号整数(如果没有,则只能使用无符号数字)。它们还定义了字长,以上是针对32位操作的。如果您喜欢68位加法,请更改为16rFFFFFFFFFFFFFFFFFFF。
高尔夫版本(123个字符)(通过重复使用m来避免长面具):
[:a :b||s c n m|s:=a bitXor:b.c:=(a&b)<<1.[c~=0]whileTrue:[n:=s&c.s:=s bitXor:c.c:=n<<1.c:=c&m:=16rFFFFFFFF.s:=s&m].s]
(*)通过使用-1而不是16rFFFFFFFF,我们可以更好地打高尔夫球,但是该代码不再适用于任意精度数字,仅适用于机器字大小的smallIntegers(Ansi标准中未定义largeIntegers的表示形式):
[:a :b||s c n|s:=a bitXor:b.c:=(a&b)<<1.[c~=0]whileTrue:[n:=s&c.s:=s bitXor:c.c:=n<<1.c:=c&-1.s:=s&-1].s]
这使代码大小降至105个字符。