C++ 我的方法需要使用更少的运算符

C++ 我的方法需要使用更少的运算符,c++,operators,bit-manipulation,C++,Operators,Bit Manipulation,我正在做一个家庭作业,其中我需要创建一个最多包含24个运算符的按位方法。我的代码可以工作…但是我有25个操作符,一个太多了。有人能找到一种更有效的方法来完成一段代码吗 int isGreater(int x, int y) { int xSign = (x>>31); int ySign = (y>>31); int check1 = (xSign & ySign) | (~xSign & ~ySign);

我正在做一个家庭作业,其中我需要创建一个最多包含24个运算符的按位方法。我的代码可以工作…但是我有25个操作符,一个太多了。有人能找到一种更有效的方法来完成一段代码吗

 int isGreater(int x, int y)
    {
      int xSign = (x>>31);
      int ySign = (y>>31);
      int check1 = (xSign & ySign) | (~xSign & ~ySign);
      int same = !((( x + ((~y) + 1) )>>31) & 0x1);
      int check2 = (check1 & same) | (~check1 & !xSign);
      int equal = ((!(x ^ y))<<31)>>31;
      return 0 | (~equal & check2);
    }
int大于(int x,int y)
{
int xSign=(x>>31);
int-ySign=(y>>31);
int check1=(xSign&ySign)|(~xSign&ySign);
int same=!((x+(~y)+1))>>31)和0x1);
int check2=(check1&same)|(~check1&!xSign);
整数等于(!(x^y))31;
返回0 |(~equal&check2);
}

尝试更改此行:

int check1 = (xSign & ySign) | (~xSign & ~ySign);
为此:

int check1 = (xSign & ySign) | ~(xSign | ySign);
少了一个操作员。

这一行:

返回0 |(~equal&check2);

可简化为:

返回(~equal&check2);


(按位
或带有
0
没有任何效果)

check1
仅仅是一个
xnor
。为什么不替换它:

  int check1 = (xSign & ySign) | (~xSign & ~ySign);
  int equal = ((!(x ^ y))<<31)>>31;
为此:

  int check1 = ~(xSign ^ ySign);
  int equal = ((!(x ^ y)) & 0x1;
你的版本有5位运算符,我的版本有2位运算符

请注意,如果使用以下选项,您的代码将更加美观:

  int check1 = !(xSign ^ ySign);

也就是说,逻辑求反而不是按位求反,但不要担心正确性,因为最终您将删除所有的高位。

假设
int
s为32位宽,您可以替换为:

  int check1 = (xSign & ySign) | (~xSign & ~ySign);
  int equal = ((!(x ^ y))<<31)>>31;

然后再保存一个。

因为你显然可以使用加法,在我看来,有一种更简单的方法:

int isGreater(int x, int y) {
    return ((unsigned)(~x + 1 + y)>>31) & 1;
}
基本思想很简单——从y中减去x,然后检查结果是否为负。为了保持至少一点挑战性,我假设我们不能直接进行减法,所以我们必须自己对数字求反(使用两个补码,所以翻转位并加一)

五个操作员——如果包括演员,六个操作员

值得注意的一点是:您对
same
的计算本身就已经足够了(事实上,这太过分了——您需要消除逻辑否定)

执行快速测试[编辑:更新测试代码以包含更多边界条件]:

int main() {
    std::cout << isGreater(1, 2) << "\n";
    std::cout << isGreater(1, 1) << "\n";
    std::cout << isGreater(2, 1) << "\n";
    std::cout << isGreater(-10, -11) << "\n";
    std::cout << isGreater(-128, 11) << "\n";
    std::cout << isGreater(INT_MIN, INT_MIN) << "\n";
    std::cout << isGreater(INT_MAX, INT_MAX) << "\n";
    return 0;
}

0
0
1
1
0
0
0
0
intmain(){

std::cout我在C中提出了这个相对较短的解决方案,它处理从
INT\u MIN
INT\u MAX
的整个INT范围

它期望有符号整数实现为2的补码,并且它不期望有符号溢出产生不良副作用(已知会导致未定义的行为)

#包括
#包括
整数大于整数(整数x,整数y)
{
//“x>y”相当于“!(x=x)”,
//这相当于“!(y-x>=0)”。
int nx=~x+1;//nx=-x(在2的补码整数数学中)
int r=y+nx;//r=y-x(最终,我们对r的符号感兴趣,
//r是否为负)
nx^=nx&x;//nx包含-x的正确符号(对于x=INT\u MIN也正确)
//如果r=y+nx中出现溢出,则r的符号错误。
//在这种情况下,它(r的符号)必须反转。
//当加数(-x和y)具有相同的符号时,会发生溢出
//(两者均为负或均为非负)及其和的(r)符号
//是加数符号的对立面。
r^=~(nx^y)&(nx^r);//更正r=y-x的符号
r>>=(CHAR_BIT*sizeof(int)-1);//按编译时常量移位
return r&1;//返回y-x的符号
}
int testDataSigned[]=
{
国际民,
内部最小值+1,
-1,
0,
1.
INT_MAX-1,
最大整数
};
内部主(空)
{
int i,j;
对于(j=0;j“>\0请看问题是…我还必须处理负数。因此,您的代码可以工作,就像我的int一样…但只有当两个数字都是正数时才可以。我的额外代码是检查x和y是正数还是负数。我还检查了这两个数字是否相等,以涵盖所有问题。”bases@Guambler:没问题。这对你有效或者负数。(或者你想把,-10看作大于-1,所以你真的在比较震级?@Guambler:我没有——我只是试过
isbetter(INT_MIN,INT_MIN)
,它会产生0,正如我预期的那样。当差分中存在算术溢出时,这将不起作用。您计算INT_MIN-INT_MAX并得到1,这是非负的,而数学上正确的差分应该是负的。