如何在erlang中获取一点十进制整数

时间:2013-03-01 18:29:58

标签: erlang

给定一个数字,例如16877,我想测试位位置(pos)以查看是否为0或1.

例如,我知道上面的数字是数字显示为100000111101101.

  • bit pos 1 = 1
  • bit pos 2 = 0
  • bit pos 3 = 1

考虑到数字应该作为二进制文件存储在erlang的vm中,我可以使用什么函数,比如说:

Pos = 1,
Bit = getBit ( Pos , 16877 ).

3 个答案:

答案 0 :(得分:5)

应该这样做。

bit(Number, Bit) ->
  (Number bsr Bit) band 1.

答案 1 :(得分:3)

使用按位运算符,Luke!

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

答案 2 :(得分:-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