2進数xの1番右にある1の位置を求めるには

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