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
的常见做法。