C 使用位运算时不相等?

C 使用位运算时不相等?,c,bitwise-operators,C,Bitwise Operators,我会直截了当地说:这是家庭作业。然而,由于我已经完成了这个问题,并且只是对我所做的不同实现感到好奇,我认为咨询你们是可以的 问题是建立一个=使用位操作的函数。我们也可以使用和+ 如果x==y,则返回0,否则返回1 int eval_not_equal(int x, int y) { int result = x ^ y; if(result == 0) { result = 0; } else { result = 1;

我会直截了当地说:这是家庭作业。然而,由于我已经完成了这个问题,并且只是对我所做的不同实现感到好奇,我认为咨询你们是可以的

问题是建立一个
=使用位操作的函数。我们也可以使用
+

如果
x==y
,则返回
0
,否则返回
1

int eval_not_equal(int x, int y) {
    int result = x ^ y;
    if(result == 0) {
        result = 0;
    }
    else {
       result = 1; 
     }
    return result;
}
我认为这是对这个问题的完美回答,但我想知道是否有可能不使用
if
?有很多不同的按位运算,我相信一定有办法使用它们来替换我使用的
if


我很想知道你们的想法!:-)

您可以执行以下操作:

return !(x ^ y);

我不明白你为什么不能使用
操作符=

int eval_不等于(int x,int y){
返回x!=y;
}
但是如果这是一种需要避免的挑战的话=在代码中,然后您可以这样编写:

int eval_不等于(int x,int y){
返回!!(x^y);
}
在上面的代码中,
x^y
的结果被视为bool,然后被否定。“false”的布尔等价物为0;默认情况下“true”是1(但实际上任何非零整数都是true)

如果这是C++,或者使用STDBOL(C99),那么你也可以这样做:

int eval_不等于(int x,int y){
返回(bool)(x^y);
}
更新: 问题是要建立一个仅使用位运算的函数

如果“only”是关键,那么我以前的答案和OP的解决方案都无效,因为
是一个非位布尔运算符。这同样适用于类型转换
(bool)
if
子句

老实说,以下代码很荒谬,但它只使用位运算:

int eval_不等于(int x,int y){
int xo=(x^y);
返回(xo>>(ffs(xo)-1))&1;
}

函数
ffs()
返回第一个设置位,即第一个位的索引等于1。我们只需要那个位,所以我们将异或结果右移
ffs-1
以去除所有低位,然后用1进行逐位运算以清除高位。

如果它们不相等,则不会返回
1
。您可能需要双反;)请注意,这种方法仅在实现使用2的补码来表示整数时有效(这是目前公认的标准)。我认为,如果不使用位操作以外的其他操作(隐式或显式),这是不可能做到的。比较不是位运算(
==
),逻辑非(
)不是位运算,像
if(x^y)
这样的构造也是逻辑运算。下面使用的函数
ffs()
不是c原语,它的实现也必须使用逻辑运算。为什么在使用按位异或时使用双反运算?双重否定只是删除了第一个否定,这使得它完全过时了。(0^0=0),(0^1=1),(1^0=1),(1^1=0)OP希望这样做的原因可能是某种形式的预成熟优化。许多体系结构将转换为
=转换为机器代码中的异或。但是编译器完全能够进行这种优化。这就是说,函数调用开销是需要时间的。@Pethead,因为XOR已经类似于“不相等”,除非结果为非零,否则它可以有任何值。然而
=
精确返回
1
,类似于布尔值。双人!!将非零变为零,然后将其变为数字
1
@Pethead:
1^2==3
!(1^2)==0
!!(1^2)==1
@Pethead的用法
是将任何非零值映射到
true
的常见做法。