以下のプログラムについて質問お願いいたします。

--- 以下プログラム ---
public static int TwoAdicValuation(ulong x)
  => TwoAdicValuationTable[(x & ~x + 1) % 67];

static readonly int[] TwoAdicValuationTable
  = InitializeTwoAdicValuationTable();
static int[] InitializeTwoAdicValuationTable() {
  var table = new int[67];
  table[0] = -1;
  for (var i = 0; i < 64; i++) {
    table[(1UL << i) % 67] = i;
  }
  return table;
}
--- 以上プログラム ---

上記の TwoAdicValuation メソッドは、
・引数 x がゼロのときは -1 を返す
・それ以外の場合、引数 x が 2 で割れる回数を返す
という動作をするようです。
例えば TwoAdicValuation(2*3*5) は 1,
TwoAdicValuation(2*2*2*17) は 3,
TwoAdicValuation(19) は 0,
TwoAdicValuation(0) は -1 を返します。

しかしプログラムを読んでみても、
何がどうなってそのような動作になっているのかどうしても理解できません。
何かお分かりになることがあれば
どんなことでも構いませんので教えていただけないでしょうか。
どうぞよろしくお願いいたします。