2016-12-23 12 views
0

ハッカーズ・ディライトのchapter 2を読んで、Erlangでビット操作を実装しようとしました。Erlangのbitwise bnot演算子を使用したビット操作

私はこの1つ上のこだわっている:

例えば10100111(なした場合、すべての1年代を生産、0の末尾の1×での、1の他の場所の位置でと単語を作成するには、次の式を使用します=> 11111000):ここで

  ¬ x | (x + 1) 

は、私が試したものです:

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

しかし何らかの理由で-1000の結果があり、2#11111000ではありません。

not 2#10100111-10101000(ベース2)です。

何が起こっているのでしょうか?

+0

-1000は、読んでいる方法によっては、2#11111000と同じことがあります。あなたはそれが本当に異なっていることを確認できますか? – harold

+0

Erlangは整数のサイズを制限しないため、符号ビットの固定位置はありません。正の数の前に無限のゼロがあるように、負の数は無限の接頭辞を持つものと見なされます。したがって、bnot 2#0001は2#... 1110(-2、2の補数)、bnot 2#0010は2#... 1101(-3の2の補数)などです。 bsl(W-1) - 1の場合、結果をWビットで正の数に切り捨てることができます。 – RichardC

+0

@リチャードCこれを回答にすることができますか? '2#... 1101'が' -4'であることを意味しましたか? '101'は4なので?あるいは、私は何かを誤解しているでしょうか? – drozzy

答えて

5

数値が操作されたときの幅(符号の問題、ビギナムと整数表現の問題)を制限する必要があります。

次の例では8ビットを使用しますが、128ビットで同じように動作します。この場合、結果はではなく340282366920938463463374607431768211448になります。

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 
関連する問題