16877 などの数値が与えられた場合、ビット位置 (pos) をテストして、0 か 1 かを確認します。
たとえば、上記の数値は 100000111101101 として表される数字であることがわかっています。
- ビット位置 1 = 1
- ビット位置 2 = 0
- ビット位置 3 = 1
数値がすでにバイナリとして erlang の vm に格納されている必要があることを考えると、次のように使用できる関数は次のとおりです。
Pos = 1,
Bit = getBit ( Pos , 16877 ).
16877 などの数値が与えられた場合、ビット位置 (pos) をテストして、0 か 1 かを確認します。
たとえば、上記の数値は 100000111101101 として表される数字であることがわかっています。
数値がすでにバイナリとして erlang の vm に格納されている必要があることを考えると、次のように使用できる関数は次のとおりです。
Pos = 1,
Bit = getBit ( Pos , 16877 ).
これで済むはずです。
bit(Number, Bit) ->
(Number bsr Bit) band 1.
ビットごとの演算子を使用してください、ルーク!
getBit(Pos, Number) ->
case (1 bsl Pos) band Number of
0 -> 0;
_ -> 1
end.
この関数は 0 からの位置を受け入れますが、1 ベースのインデックスが好きな場合は、Pos を自由に減らしてください。
1> Fun = fun(Pos, Num) -> case (1 bsl Pos) band Num of 0 -> 0; _ -> 1 end end.
#Fun<erl_eval.12.82930912>
2> Fun(0, 16877).
1
3> Fun(1, 16877).
0
4> Fun(2, 16877).
1
5> Fun(3, 16877).
1
ライブラリにこのようなものがあるかどうかはわかりませんが、実装は次のとおりです。
get_bit(1, Num) -> Num rem 2;
get_bit(Pos, Num) -> get_bit(Pos-1, Num div 2).
そして出力:
1> test:get_bit(2, 16877).
0
2> test:get_bit(3, 16877).
1
3> test:get_bit(6, 16877).
1
4> test:get_bit(10, 16877).
0
5> test:get_bit(11, 16877).
0