[erlang-questions] How to efficiently set the bit at position Index to 1 in a binary?

Zabrane Mickael zabrane3@REDACTED
Sat Dec 24 22:52:12 CET 2011


Your trick is simply awesome Jachym ;-)

Regards,
Zabrane

On Dec 24, 2011, at 8:17 PM, Jachym Holecek wrote:

> # Zabrane Mickael 2011-12-24:
>> Hi folks,
>> 
>> Here's my code:
>> 
>> %%--------------------------------------------------------------------
>> %% @doc Set the bit at position Index to 1 in the binary Bin.
>> %% @end
>> %%--------------------------------------------------------------------
>> -spec set(Bin :: binary(), Index :: non_neg_integer()) -> binary().
>> set(<<1:1, _/bits>> = Bin, 0) ->
>>    Bin;
>> set(<<0:1, Rest/bits>>, 0) ->
>>    <<1:1, Rest/bits>>;
>> set(Bin, Index) when Index > 0 ->
>>    Before = Index - 1,
>>    <<Head:Before, _:1, Rest/bits>> = Bin,
>>    <<Head:Before, 1:1, Rest/bits>>.
>> 
>> 
>> After compiling, I'm getting the following warnings:
>> src/foo.erl:248: Warning: INFO: the '=' operator will prevent delayed sub binary optimization
>> src/foo.erl:248: Warning: INFO: the '=' operator will prevent delayed sub binary optimization
>> src/foo.erl:250: Warning: NOT OPTIMIZED: sub binary is used or returned
>> src/foo.erl:254: Warning: NOT OPTIMIZED: sub binary is used or returned
>> 
>> What's the best/optimized solution and how to get rid of these warnings?
> 
> Binary matching is *much* more powerful than what it looks like at first:
> 
>  -module(a).
>  -export([a/2]).
> 
>  a(N, B) ->
>      fun (<<L:N/bits, _:1, R/bits>>) ->
>          <<L/bits, 1:1, R/bits>> 
>      end(B).
> 
> The compiler refuses the saner form (doing the binary match in a/1's head
> directly) quoting the delusion that N isn't bound at that point... pity.
> 
> Have fun,
> 	-- Jachym






More information about the erlang-questions mailing list