多倍長整数クラス 乗算 作成途中 [2日目]

すっごいコードになってしまいました。
睡眠不足&混乱気味ながら96bitのMAX値の掛け算は正しかったので、とりあえず・・・
多分もっと変わるかと思います。

BigUInt& BigUInt::operator*=(const BigUInt& p) {
	//int i, j;
	//int m, n;
	//unsigned long w[6];
	//unsigned long long k, t;

	//m = n = 3;

	//for (i = 0; i < m; i++) {
	//	w[i] = 0;
	//}

	//for (j = 0; j < n; j++) {
	//	k = 0;
	//	for (i = 0; i < m; i++) {
	//		t = bits[i] * p.bits[j] + w[i + j] + k;
	//		w[i + j] = (unsigned long)t;
	//		k = t >> 16 >> 16;		// k = t >> 32;
	//	}
	//	w[j + m] = (unsigned long)k;
	//}
	//
	//bits[0] = w[0];
	//bits[1] = w[1];
	//bits[2] = w[2];

	unsigned long long u[3], v[3];
	unsigned long long w[9];
	unsigned long long s[2];
	
	u[0] = bits[0]; u[1] = bits[1]; u[2] = bits[2];
	v[0] = p.bits[0]; v[1] = p.bits[1]; v[2] = p.bits[2];
	
	w[0] = u[0] * v[0];
	w[1] = u[0] * v[1];
	w[2] = u[0] * v[2];
	w[3] = u[1] * v[0];
	w[4] = u[1] * v[1];
	w[5] = u[1] * v[2];
	w[6] = u[2] * v[0];
	w[7] = u[2] * v[1];
	w[8] = u[2] * v[2];
	
	w[1] = w[1] <<16<<16;
	w[2] = w[2] <<16<<16 <<16<<16;
	w[3] = w[3] <<16<<16;
	w[4] = w[4] <<16<<16 <<16<<16;
	w[5] = w[5] <<16<<16 <<16<<16 <<16<<16;
	w[6] = w[6] <<16<<16 <<16<<16;
	w[7] = w[7] <<16<<16 <<16<<16 <<16<<16;
	w[8] = w[8] <<16<<16 <<16<<16 <<16<<16 <<16<<16;

	s[0] = w[0] + w[1] + w[2] + w[3] + w[4] + w[5];
	s[1] = w[6] + w[7] + w[8];

	bits[0] = (unsigned long)s[0];
	bits[1] = (unsigned long)(s[0] >> 16 >> 16 & 0xFFFFFFFF);
	bits[2] = (unsigned long)s[1] & 0xFFFFFFFF;

	return *this;
}