x & -x は Hacker's delight にある、立っている一番右端のビットだけ残して0にしてしまう黒魔術
http://d.hatena.ne.jp/siokoshou/20090704
コードで試してみた
20.times{|i|
puts i.to_s + ' & ' + (-i).to_s + ' (10) = ' + (i&(-i)).to_s
puts i.to_s(2)+' & '+(-i).to_s(2)+' (2) = ' + (i&(-i)).to_s(2)
puts ''
}
0 & 0 (10) = 0
0 & 0 (2) = 0
1 & -1 (10) = 1
1 & -1 (2) = 1
2 & -2 (10) = 2
10 & -10 (2) = 10
3 & -3 (10) = 1
11 & -11 (2) = 1
4 & -4 (10) = 4
100 & -100 (2) = 100
5 & -5 (10) = 1
101 & -101 (2) = 1
6 & -6 (10) = 2
110 & -110 (2) = 10
7 & -7 (10) = 1
111 & -111 (2) = 1
8 & -8 (10) = 8
1000 & -1000 (2) = 1000
9 & -9 (10) = 1
1001 & -1001 (2) = 1
10 & -10 (10) = 2
1010 & -1010 (2) = 10
11 & -11 (10) = 1
1011 & -1011 (2) = 1
12 & -12 (10) = 4
1100 & -1100 (2) = 100
13 & -13 (10) = 1
1101 & -1101 (2) = 1
14 & -14 (10) = 2
1110 & -1110 (2) = 10
15 & -15 (10) = 1
1111 & -1111 (2) = 1
16 & -16 (10) = 16
10000 & -10000 (2) = 10000
17 & -17 (10) = 1
10001 & -10001 (2) = 1
18 & -18 (10) = 2
10010 & -10010 (2) = 10
19 & -19 (10) = 1
10011 & -10011 (2) = 1