使用Erlang的bitwise bnot运算符进行位操作

时间:2016-12-23 10:48:35

标签: erlang bit-manipulation

阅读Hacker's Delight的chapter 2并尝试在Erlang中实现位操作。

我坚持这个:

  

使用以下公式在x中的尾随1的位置创建一个0的单词,在其他位置创建1的单词,如果没有则生成全1(例如10100111 => 11111000):

          ¬ x | (x + 1)

以下是我的尝试:

(bnot X) bor (X + 2#01)

但由于某种原因结果为-1000,而不是2#11111000

奇怪的是not 2#10100111-10101000(基数2)。

知道发生了什么事吗?

1 个答案:

答案 0 :(得分:4)

你必须限制操纵数字的宽度(符号问题,bignum问题和整数表示)。

下一个示例使用8位,但它的工作方式与128位相同,在这种情况下,对于您的测试用例,结果将是340282366920938463463374607431768211448而不是248

1> Msk = fun(X) -> X band 2#11111111 end. % limit to 8 bits
#Fun<erl_eval.6.52032458>
2> Op = fun(X) -> Msk(bnot(X)) bor Msk(X+1) end.
#Fun<erl_eval.6.52032458>
3> Op(2#10100111).
248
4> 2#11111000.
248