#include "iostream"
#include "bitset"
#include "limits"
using namespace std;
#define out2(T) cout<<bitset<numeric_limits<unsigned int>::digits>(T)<<endl
#define SIZE(T) (numeric_limits<unsigned T>::digits)
bool SHR31(int x) //逻辑右移位
{
return (unsigned int)x>>31;
}
unsigned int nlz(unsigned int x) //计算前导数目
{
int s = SIZE(int);
unsigned int L = (unsigned int)(1) << (s-1);
unsigned int i = 0; while ( !(x&L) && i < s) {x<<=1; i++;}
return i;
}
//检测x+y+c 的溢出
//溢出条件x和y符号相同,且x+y+c的符号与x相反
bool AOF(int x, int y, int c)
{
// return SHR31( ~(x^y) & ((x+y+c)^x) );
// return SHR31( ((x+y+c)^x) & ((x+y+c)^y) );
int z = ~(x^y) & 0x80000000;
return SHR31( ~(x^y) & ~(((x^z)+y+c)^y) );
}
//检测x-y-c 的溢出
//溢出条件x和y符号相反,且x+y+c的符号与x相反(或说与y符号相同)
bool SOF(int x, int y, int c)
{
// return SHR31( (x^y) & ((x-y-c)^x) );
// return SHR31( ((x-y-c)^x) & ~((x-y-c)^y) );
int z = (x^y) & 0x80000000;
return SHR31( (x^y) & (((x^z)-y-c)^y) );
}
//无符号数x+y+c 的溢出
bool UAOF(unsigned int x, unsigned int y, unsigned int c)
{
// return SHR31( x&y | (x|y)&~(x+y+c) );
// return SHR31( (x>>1) + (y>>1) + ( (x&y | (x|y) & c) & 1 ) );
// if (c) return ~x <= y; else return ~x < y;
if (c) return x+y+1 <= x; else return x+y < x;
}
//无符号数x-y-c 的溢出
bool USOF(unsigned int x, unsigned int y, unsigned int c)
{
// return SHR31( ~x&y | ~(x^y) & x-y-c );
// return SHR31( ~x&y | (~x|y) & x-y-c );
// return SHR31( (x>>1) - (y>>1) - ( (~x&y | (~x|y) & c) & 1 ) );
// if (c) return x <= y; else return x < y;
if (c) return x-y-1 >= x; else return x-y > x;
}
//有符号x*y 的溢出
bool MOF(int x, int y)
{
return (y<0 && x==0x80000000) || (y && x*y /y != x);
}
bool MOF1(int x, int y)
{
unsigned int c = (~(x^y) >> 31) + 0x80000000;
x = (unsigned int)abs(x);
y = (unsigned int)abs(y);
return y && x > (c/y);
}
//无符号x*y 的溢出
bool UMOF(unsigned int x, unsigned int y)
{
// return y && x*y /y != x;
return y && x > (0xFFFFFFFF / y);
}
bool UMOF1(unsigned int x, unsigned int y)
{
unsigned int m, n, t, z;
m = nlz(x);
n = nlz(y);
if (m + n <= 30) return true;
t = x*(y>>1);
if ((int)t < 0) return true;
z = t*2;
if (y & 1) {
z += x;
if (z < x) return true;
}
// z is the correct product of x and y
return false;
}
//有符号x/y 的溢出
bool DOF(int x, int y)
{
// return !y | (x==0x80000000 && y==-1);
return (abs(y^0x80000000) | abs(x) & abs(~(y^0x80000000))) < 0;
}
bool DOF1(int x, int y)
{
int z = (x^0x80000000) | (y+1);
// return ((y|-y) & (z|-z)) >= 0;
// return (-abs(y) & -abs(z)) >= 0;
return (nlz(y) | nlz(z)>>5) != 0;
}
//无符号x/y 的溢出
bool UDOF(unsigned int x, unsigned int y)
{
return !y;
}
void test11();
void main()
{
// test1();
// test2();
// test3();
// test4();
// test5();
// test6();
// test7();
// test8();
// test9();
// test10();
test11();
}
void test11()
{
unsigned int x, y;
x = 0xFFFFFFFF; y = 1;
cout << x << " " << y << " " << endl;
cout << UDOF(x, y) << endl;
x = 1; y = 0xFFFFFFFF;
cout << x << " " << y << " " << endl;
cout << UDOF(x, y) << endl;
x = 0xFFFFFFFF; y = -1;
cout << x << " " << y << " " << endl;
cout << UDOF(x, y) << endl;
x = -1; y = -0xFFFFFFFF;
cout << x << " " << y << " " << endl;
cout << UDOF(x, y) << endl;
x = -1; y = -0xFFFF;
cout << x << " " << y << " " << endl;
cout << UDOF(x, y) << endl;
x = 0xABC; y = 0xFD;
cout << x << " " << y << " " << endl;
cout << UDOF(x, y) << endl;
x = 0; y = 0;
cout << x << " " << y << " " << endl;
cout << UDOF(x, y) << endl;
x = 0xFFFFFFFF; y = 0;
cout << x << " " << y << " " << endl;
cout << UDOF(x, y) << endl;
x = 0x7FFFFFFF; y = 0;
cout << x << " " << y << " " << endl;
cout << UDOF(x, y) << endl;
}
void test10()
{
int x, y;
x = 0x7FFFFFFF; y = 0xABCDEFDC;
cout << x << " " << y << " " << endl;
cout << DOF1(x, y) << endl;
x = 1; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << DOF1(x, y) << endl;
x = 0x7FFFFFFF; y = -1;
cout << x << " " << y << " " << endl;
cout << DOF1(x, y) << endl;
x = 0x7FFFFFFF; y = -2;
cout << x << " " << y << " " << endl;
cout << DOF1(x, y) << endl;
x = 0x80000000; y = 1;
cout << x << " " << y << " " << endl;
cout << DOF1(x, y) << endl;
x = 0x80000000; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << DOF1(x, y) << endl;
x = 0x80000000; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << DOF1(x, y) << endl;
x = 0x80000000; y = -1;
cout << x << " " << y << " " << endl;
cout << DOF1(x, y) << endl;
x = 0x80000000; y = -2;
cout << x << " " << y << " " << endl;
cout << DOF1(x, y) << endl;
x = 0x80000000; y = 0;
cout << x << " " << y << " " << endl;
cout << DOF1(x, y) << endl;
x = 0x7FFFFFFF; y = 1;
cout << x << " " << y << " " << endl;
cout << DOF1(x, y) << endl;
}
void test9()
{
int x, y;
x = 0x7FFFFFFF; y = 0xABCDEFDC;
cout << x << " " << y << " " << endl;
cout << DOF(x, y) << endl;
x = 1; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << DOF(x, y) << endl;
x = 0x7FFFFFFF; y = -1;
cout << x << " " << y << " " << endl;
cout << DOF(x, y) << endl;
x = 0x7FFFFFFF; y = -2;
cout << x << " " << y << " " << endl;
cout << DOF(x, y) << endl;
x = 0x80000000; y = 1;
cout << x << " " << y << " " << endl;
cout << DOF(x, y) << endl;
x = 0x80000000; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << DOF(x, y) << endl;
x = 0x80000000; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << DOF(x, y) << endl;
x = 0x80000000; y = -1;
cout << x << " " << y << " " << endl;
cout << DOF(x, y) << endl;
x = 0x80000000; y = -2;
cout << x << " " << y << " " << endl;
cout << DOF(x, y) << endl;
x = 0x80000000; y = 0;
cout << x << " " << y << " " << endl;
cout << DOF(x, y) << endl;
x = 0x7FFFFFFF; y = 1;
cout << x << " " << y << " " << endl;
cout << DOF(x, y) << endl;
}
void test8()
{
unsigned int x, y;
x = 2; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << UMOF1(x, y) << endl;
x = 0xF; y = 0x11111111;
cout << x << " " << y << " " << endl;
cout << UMOF1(x, y) << endl;
x = -1; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << UMOF1(x, y) << endl;
x = -1; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << UMOF1(x, y) << endl;
x = 0; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << UMOF1(x, y) << endl;
x = 0; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << UMOF1(x, y) << endl;
x = 0x7FFFFFFF; y = 0;
cout << x << " " << y << " " << endl;
cout << UMOF1(x, y) << endl;
x = 0x80000000; y = 0;
cout << x << " " << y << " " << endl;
cout << UMOF1(x, y) << endl;
}
void test7()
{
unsigned int x, y;
x = 2; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << UMOF(x, y) << endl;
x = 0xF; y = 0x11111111;
cout << x << " " << y << " " << endl;
cout << UMOF(x, y) << endl;
x = -1; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << UMOF(x, y) << endl;
x = -1; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << UMOF(x, y) << endl;
x = 0; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << UMOF(x, y) << endl;
x = 0; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << UMOF(x, y) << endl;
x = 0x7FFFFFFF; y = 0;
cout << x << " " << y << " " << endl;
cout << UMOF(x, y) << endl;
x = 0x80000000; y = 0;
cout << x << " " << y << " " << endl;
cout << UMOF(x, y) << endl;
}
void test6()
{
int x, y;
x = 1; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = 0x7FFFFFFF; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = 0x7FFFFFFF; y = -1;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = 0x7FFFFFFF; y = -0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = -1; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = -0x7FFFFFFF; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = -1; y = -0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = -1; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = 0x80000000; y = -1;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = 0x80000000; y = -2;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = 0; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = 0; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = 0x7FFFFFFF; y = 0;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = 0x80000000; y = 0;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = 1<<30; y = 2;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
x = -(1<<30); y = -2;
cout << x << " " << y << " " << endl;
cout << MOF1(x, y) << endl;
}
void test5()
{
int x, y;
x = 1; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = 0x7FFFFFFF; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = 0x7FFFFFFF; y = -1;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = 0x7FFFFFFF; y = -0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = -1; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = -0x7FFFFFFF; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = -1; y = -0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = -1; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = 0x80000000; y = -1;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = 0x80000000; y = -2;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = 0; y = 0x7FFFFFFF;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = 0; y = 0x80000000;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = 0x7FFFFFFF; y = 0;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = 0x80000000; y = 0;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = 1<<30; y = 2;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
x = -(1<<30); y = -2;
cout << x << " " << y << " " << endl;
cout << MOF(x, y) << endl;
}
void test4()
{
unsigned int x, unsigned int y, unsigned int c;
x = 0xFFFFFFFF; y = 0xFFFFFFFF; c = 1;
cout << x << " " << y << " " << c << endl;
cout << USOF(x, y, c) << endl;
x = 0x80000000; y = 0x7FFFFFFF; c = 1;
cout << x << " " << y << " " << c << endl;
cout << USOF(x, y, c) << endl;
x = 0xFFFFFFFF; y = 0x7FFFFFFF; c = 1;
cout << x << " " << y << " " << c << endl;
cout << USOF(x, y, c) << endl;
x = 0x0FABCDEF; y = 0x1FFBCEDA; c = 0;
cout << x << " " << y << " " << c << endl;
cout << USOF(x, y, c) << endl;
x = 1; y = 1; c = 0;
cout << x << " " << y << " " << c << endl;
cout << USOF(x, y, c) << endl;
x = 1; y = 1; c = 1;
cout << x << " " << y << " " << c << endl;
cout << USOF(x, y, c) << endl;
x = 0; y = 1; c = 0;
cout << x << " " << y << " " << c << endl;
cout << USOF(x, y, c) << endl;
x = 0; y = 0; c = 1;
cout << x << " " << y << " " << c << endl;
cout << USOF(x, y, c) << endl;
x = 0; y = 0x80000000; c = 1;
cout << x << " " << y << " " << c << endl;
cout << USOF(x, y, c) << endl;
}
void test3()
{
unsigned int x, unsigned int y, unsigned int c;
x = 0x7FFFFFFF; y = 0x7FFFFFFF; c = 1;
cout << x << " " << y << " " << c << endl;
cout << UAOF(x, y, c) << endl;
x = 0x7FFFFFFF; y = 0x80000000; c = 0;
cout << x << " " << y << " " << c << endl;
cout << UAOF(x, y, c) << endl;
x = 0x7FFFFFFF; y = 0x80000000; c = 1;
cout << x << " " << y << " " << c << endl;
cout << UAOF(x, y, c) << endl;
x = 0xFFFFFFFF; y = 0xFFFFFFFF; c = 1;
cout << x << " " << y << " " << c << endl;
cout << UAOF(x, y, c) << endl;
x = 0xFFFF0000; y = 0x0000FFFF; c = 1;
cout << x << " " << y << " " << c << endl;
cout << UAOF(x, y, c) << endl;
x = 0; y = 0xFFFFFFFF; c = 1;
cout << x << " " << y << " " << c << endl;
cout << UAOF(x, y, c) << endl;
x = 1; y = 0xFFFFFFFF; c = 0;
cout << x << " " << y << " " << c << endl;
cout << UAOF(x, y, c) << endl;
x = 1; y = 0xFFFFFFFF; c = 1;
cout << x << " " << y << " " << c << endl;
cout << UAOF(x, y, c) << endl;
x = 0xA5A5A5A5; y = 0x5A5A5A5A; c = 0;
cout << x << " " << y << " " << c << endl;
cout << UAOF(x, y, c) << endl;
x = 0xA5A5A5A5; y = 0x5A5A5A5A; c = 1;
cout << x << " " << y << " " << c << endl;
cout << UAOF(x, y, c) << endl;
}
void test2()
{
int x, y, c;
x = -1; y = 0x7FFFFFFF; c = 1;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
x = -2; y = 0x7FFFFFFF; c = 0;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
x = -0x5FFFFFFF; y = 0x3FFFFFFF; c = 0;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
x = -0x4FFFFFFF; y = 0x30000001; c = 1;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
x = -0x4FFFFFFF; y = 0x30000001; c = 0;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
x = 0x7FFFFFFF; y = -0x7FFFFFFF; c = 1;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
x = 0x7FFFFFFF; y = -1; c = 0;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
x = 0; y = -0x80000000; c = 0;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
x = 0; y = 0x80000000; c = 1;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
x = -2; y = -3; c = 0;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
x = 1; y = 1; c = 1;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
x = 1; y = 0x80000000; c = 1;
cout << x << " " << y << " " << c << endl;
cout << SOF(x, y, c) << endl;
}
void test1()
{
int x, y, c;
x = 0x7FFFFFFF; y = 1; c = 1;
cout << x << " " << y << " " << c << endl;
cout << AOF(x, y, c) << endl;
x = 0x7FFFFFFF; y = 0; c = 1;
cout << x << " " << y << " " << c << endl;
cout << AOF(x, y, c) << endl;
x = 0x7FFFFFFF; y = 1; c = 0;
cout << x << " " << y << " " << c << endl;
cout << AOF(x, y, c) << endl;
x = 0x7FFFFFFF; y = 0; c = 0;
cout << x << " " << y << " " << c << endl;
cout << AOF(x, y, c) << endl;
x = 0x7FFFFFFF; y = 0x7FFFFFFF; c = 1;
cout << x << " " << y << " " << c << endl;
cout << AOF(x, y, c) << endl;
x = 0x80000000; y = -1; c = 0;
cout << x << " " << y << " " << c << endl;
cout << AOF(x, y, c) << endl;
x = 0x80000000; y = 0x80000000; c = 0;
cout << x << " " << y << " " << c << endl;
cout << AOF(x, y, c) << endl;
x = 0x80000000; y = 0x80000000; c = 1;
cout << x << " " << y << " " << c << endl;
cout << AOF(x, y, c) << endl;
x = -2; y = -3; c = 0;
cout << x << " " << y << " " << c << endl;
cout << AOF(x, y, c) << endl;
x = 1; y = 1; c = 1;
cout << x << " " << y << " " << c << endl;
cout << AOF(x, y, c) << endl;
x = -2; y = 0x80000000; c = 1;
cout << x << " " << y << " " << c << endl;
cout << AOF(x, y, c) << endl;
}