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

Jachym Holecek freza@REDACTED
Sat Dec 24 20:17:24 CET 2011


# 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