Efficient bitwise operations

Rudolph van Graan <>
Fri Jun 20 10:33:32 CEST 2003


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