В этом случае я бы использовал цикл вместо умножения.Примерно так:
int newX = X;
int poweredB = ( 1 << B ); // 2^B
for( int i = 0; i < poweredB ; ++i )
{
newX += Y; // or change X directly, if you will not need it later.
}
int result = ( 1 << A ) * newX;
Но note : это будет работать только для некоторых ситуаций - только еслиу вас есть гарантия , что этот результат не будет переполнен.В вашем случае, когда Y - большое положительное число, а X - большое отрицательное число («большое» - ага, это слишком субъективно), это определенно сработает.Но если X большой положительный, а Y большой положительный - снова будет переполнение.И не только в этом случае, но и со многими другими.