Ooops! It returns 0x4000000000000000l, of course. Sorry about that.
If you want to include diagonal mills, you need more digits. You would think that 64 bits isn't enough, but we are actually only using 3 out of every 4 bits. You can just use octal instead of hexadecimal and it would work the same.
Let me know if anything is still not clear.
I think it should return 0x4000000000000000 which I'm interpreting that the horizontal mill for square 1 is closed.
Using the same concept, is it possible to determine:
1. if mills are open (1 square is still empty, 2 owned by the player)
2. if mills are blocked (2 squares owned by the player, 1 by the opponent)
3. get adjacent squares for a square
4. get empty squares
And if this would be possible, I'm assuming that shifting bits needs to be done and it wouldn't work on signed values.