Efficient bitwise operations
Per Gustafsson
per.gustafsson@REDACTED
Sun Jun 22 22:51:14 CEST 2003
There are better ways to implement rroll, lroll and swap
lroll(Byte, Rolls) ->
RestSize = 8-Rolls,
<<First:Rolls, Rest:RestSize>> = Byte
<<Rest:RestSize, First:Rolls>>.
rroll(Byte, Rolls) ->
FirstSize = 8-Rolls,
<<First:FirstSize, Rest:Rolls>> = Byte,
<<Rest:Rolls, First:FirstSize>>.
or
rroll(Byte, Rolls) ->
lroll(Byte, 8-Rolls).
swap(<<High:4, Low:4>>) ->
<<Low:4, High:4>>
Per
On Fri, 20 Jun 2003, Rudolph van Graan wrote:
> Hi there again,
>
> Thanks again for all the answers previously - helped me a lot!
>
> I've had to write some bitwise operations yesterday, because I couldn't
> locate any bifs or operations that do the same:
>
> Bitwise roll left:
>
> lroll1(<<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1>>) ->
> <<B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1,B7:1>>.
>
> rroll(<<Byte>>,Rolls) when Rolls > 0 ->
> Output = rroll1(<<Byte>>),
> rroll(Output,Rolls-1);
>
> rroll(Byte,0) ->
> Byte.
>
>
> Bitwise roll right:
>
> lroll(<<Byte>>,Rolls) when Rolls > 0 ->
> Output = lroll1(<<Byte>>),
> lroll(Output,Rolls-1);
>
> lroll(Byte,0) ->
>
> rroll1(<<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1>>) ->
> <<B0:1,B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1>>.
>
> Bitwise high <-> low nibble swap:
>
> swap(<<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1>>) ->
> <<B3:1,B2:1,B1:1,B0:1,B7:1,B6:1,B5:1,B4:1>>.
>
> My question here has to do with the efficiency of the above code.
> Normally, I would have used a single assembly instruction to achieve the
> same result, but even though the code works, how efficient can it really
> be? Are there any obvious things I've missed in the documentation?
>
> Thanks again!
>
> Rudolph
>
More information about the erlang-questions
mailing list