public class ModRange {
void testMult(int x, int y, boolean b) {
if (x * 2 == y * 2 + 1) {}
if (x * 3 == y * 3 + 1) {} // possible through overflow
if (x * 6 == y * 2 + 1) {}
int z = x * 4 + (b ? 1 : 3);
switch (z % 8) {
case -1:break;
case -2:break;
case -3:break;
case -4:break;
case -5:break;
case -6:break;
case -7:break;
case 0:break;
case 1:if(b) {} break;
case 2:break;
case 3:if(b) {} break;
case 4:break;
case 5:break;
case 6:break;
case 7:break;
}
}
void testMultLimited(int i, int j) {
if (i >= 0 && i < 10 && j >= 0 && j < 10) {
int sum = i * 3 + j * 3 + 1;
if (sum % 3 == 1) {}
}
}
void testShl(long x) {
if ((x << 32) % 16 == 0) {}
if (x << 32 == (x << 16) + 16) {}
}
void testAnd(long x) {
long res = x & 0xFFFF0001L;
long rem = res % 16;
if (rem == 0 || rem == 1) {}
res = x & 0xFFFF0001; // res can be negative now
rem = res % 16;
if (rem == 0 || rem == 1 || rem == -15) {}
}
void testAnd2(long x) {
long hi = x & 0xFF00;
long lo = x & 0x00FF;
if (hi == lo && hi % 32 == 0) {}
}
void testAndChain(long x) {
long y = x & ~1;
long z = y & ~2;
long t = z & ~4;
if (t == 0) {}
if (t == 1) {}
if (t == 2) {}
if (t == 4) {}
if (t == 7) {}
if (t == 8) {}
}
void testOr(long x) {
long y = x | 1;
if (y % 2 == 0) {}
}
void testAndOr(long x) {
if(((x & 4) | (x & 8)) == 3) {}
}
void testXor(int x, int y) {
x = (x & ~2) | 1;
y |= 3;
int z = (x ^ y) % 4;
switch (z) {
case 0:
case 1:
case 2:
case 3:
}
}
}