val is initialized to
val = x ^ y;
i.e. val is the bit-wise XOR of x and y, which means it contains 1 in all the bits where x and y differ and 0 in all the bits where x and y are the same.
Now, each iteration of the loop performs
val &= val - 1;
which is equivalent to
val = val & (val - 1);
Each such bit-wise AND operation turns a single 1 bit of val to 0.
For example, suppose the binary representation of val is:
1010
The binary representation of val - 1 is:
1001
and after performing bit-wise AND, we get:
1000
Therefore, by the end of the loop, dist contains the number of 1 bits in the original value of val, which is the number of bits by which x and y differ.
solved what does this expression mean “val&=val-1” [duplicate]