And*_*yuk 0 erlang bit-manipulation
阅读Hacker's Delight 的第 2 章并尝试在 Erlang 中实现位操作。
我被困在这个问题上:
使用以下公式创建一个单词,在 x 中尾随 1 的位置处为 0,其他位置为 1,如果没有则生成全为 1(例如 10100111 => 11111000):
Run Code Online (Sandbox Code Playgroud)¬ x | (x + 1)
这是我尝试过的:
(bnot X) bor (X + 2#01)
Run Code Online (Sandbox Code Playgroud)
但结果是-1000出于某种原因,而不是2#11111000。
奇怪的not 2#10100111是-10101000(基数为 2)。
知道发生了什么吗?
您必须限制操作数字的宽度(符号问题,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
Run Code Online (Sandbox Code Playgroud)