阅读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)。
知道发生了什么事吗?
答案 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