肝心のところがわからん

●1から200まで順に番号を振ったカードを、一枚目を最後に最後にまわし、二枚目を捨てという操作を繰り返します。最後の一枚の番号は?
○どういう原理なのか知らないが、二進数にして、ビットを反転して引けば答えが出る。
3のとき 11-00(11のビット反転) つまり3
5のとき 101-010 つまり、5-2で3
6のとき 110-001 つまり 6-1 で 5
200のとき 11001000-110111 で 200-55 =145
これが、 下の c = (~n) で、n-c の部分である。

function josephus(n){
function mask(n){
var mask = 0;
while(n >>= 1) mask += mask + 1;
return mask;
}
var c = (~n) & mask(n);
return n - c;
}
http://blog.livedoor.jp/dankogai/archives/50509245.html

○これで、 & mask(n) をとっているのは、
100をビット反転させたとき、001にならず、000100 とか(いくつつくのか知らないが)余計な0が頭につき反転すると、111011
になってしまいよくない。(n >>= 1) 一ビット右にシフトしてnに代入。これでnのビット数だけwhileでループさせる。ループの数だけ mask += mask + 1が実行される。mask の数を見ればわかるが、0.1.3.7.15.31という数列になる。二進数なら、0.1.11.111.1111.という感じで、1がならぶ。 & mask(n)で、nのビット数だけ~nを有効にしているわけだ。
○ここまでは、わかったが、なんでビットを反転して引けば答えが出るのか。なんだろ。
scriptは、まったく興味がなかったが、意外と便利なんだな。