Firstly, your code is almost correct for multiplication in $GF(2^{32})$ provided that $p$ represents the bit coefficients for the monomials $x^{31},x^{30},\ldots,x^2,x,1$ in a degree 32 irreducible polynomial. There is a fencepost issue that $i$ should run from 31 down to 0.

Now, carryless multiplication mod $2^k$ does not correspond to multiplication in a field but instead the ring $\mathbb Z[x]/x^k\mathbb Z[x]$. This is not good mathematical object to do cryptography with. For example, the low bit of the output is only a function of the low bits of the inputs. By comparison multiplication in $GF(2^k)$ all of the output bits are a function of all of the input bits. Another property of field multiplication is that it is invertible for non-zero inputs, but in our ring the function is not invertible for inputs without the low bit set.

If we consider all pairs of inputs, then outputs are not uniformly distributed. For example only 25% of inputs will produce an output with the low bit set. If we fix one of the inputs and ensure that its low bit is set then outputs are uniformly distributed, but low bits of output will only depend on low bits of input. In short it is not a good alternative.

In terms of your earlier question, there are some possible speed ups. If you precompute the code for $c$ taking values 1<<32, 1<<33,..., 1<<63 and store these values as $x[0],\ldots,x[31]$ then the code can be replaced with

```
for (int i = 31; i-- >= 0; )
{
if (c & (1L << (i + 32)))
c ^= x[i];
}
c %= 1<<32;
```

If you want something faster still, you might want to look at alternative ways of representing fields such as optimal normal bases or Zech logarithms