[erlang-questions] Fix width integer computations
Thu Dec 21 14:49:11 CET 2006
Joe Armstrong writes:
> I have a C program that has a line of code like this:
> mx = (z>>5 ^ y<<2) + (y>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
> All the variables are unsigned long
> How do I code this in Erlang?
> First thoughts:
> transcribe X >> N as trim(X bsl N)
> X << N as trim(X bsr N)
> X + Y as trim(X + Y)
> X ^ Y as X bxor Y
> where trim(X) = X band 16#ffffffff
> Is this correct? - The result must be bit identical to the C code,
> how many of the trims can I eliminate?
> A nieve translation of (y>>3 ^ z<<4)
> is trim(Y bsr 3) bxor trim(Z bsl 4)
> identical to trim((Y bsr 3) bxor (Z bsl 4)) ????
- bsl and + may extend the number of bits
- bsr (you defined it as unsigned >>) is sensitive to the number
of bits but does not extend it
- bxor preserves or reduces the number of bits
So your (y>>3) ^ (z<<4) should be (Y bsr 3) bxor trim(Z bsl 4).
More information about the erlang-questions