А я про баню...

Код
ushort VCntA, VCntB;
void vcounter_2t(ushort x) // count in seq 0, 1, 2, 2...
{
VCntA |= (VCntB & x);
VCntB |= x;
}
ushort major_3(ushort *x)
{
VCntA = VCntB = 0;
vcounter_2t(*x);
vcounter_2t(*(x+1));
vcounter_2t(*(x+2));
return VCntA;
}
Не проверял, но вроде бы похоже.
major_5, major_7 (нужно добавить VCntС) строятся аналогично.