[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,
>
>
> 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

```