只使用按位运算符(|,&,~,^,>>,<<)和其他基本运算符(如+,-和!),是否可以替换下面的“==”?
int equal(int x, int y) {
return x == y;
}
只使用按位运算符(|,&,~,^,>>,<<)和其他基本运算符(如+,-和!),是否可以替换下面的“==”?
int equal(int x, int y) {
return x == y;
}
要记住,XOR
与NOT EQUALS
完全相同,XNOR
与EQUALS
完全相同。因此,以下代码将给您提供所需的准确结果:
return !(x ^ y);
如果两个数之间没有差异,那么它们是相等的:
int equal(int x, int y){
return !(x-y);
}
x-y
的结果无法用 int
表示,这可能会导致未定义的行为。 - phuclvC !
操作符实际上只是 != 0
的简写,因此使用它似乎非常接近作弊 :)
以下是我的方法,只使用位运算,假设使用32位二进制补码机器和算术右移(严格来说,在C中算术右移是未定义的,但我见过的每个C编译器都在二进制补码机器上正确支持这个):
int t = (x - y) | (y - x); // <0 iff x != y, 0 otherwise
t >>= 31; // -1 iff x != y, 0 otherwise
return 1 + t; // 0 iff x != y, 1 otherwise
话虽如此,实际编译器并没有这个问题。真正的硬件实际上直接支持比较。细节取决于体系结构,但基本有两种模型:
More RISC-like platforms typically have direct "branch if equal" and "branch if less than" operands that do a comparison and branch based on the result. It's basically equivalent to the C code
if (a == b) goto label;
or
if (a < b) goto label;
all in one machine instruction.
这个例子与减法相同,但更明确地说明了一些架构如何进行寄存器比较(例如ARM)。
return !(1 + ~x + y);
int notEqual(int x, int y){
return (x ^ y);
}
我的看法是
int equal(int x, int y){
if((x & ~y) == 0)
return 1;
else
return 0;
}
x == y
,那么 x & ~y
的值为 0
,返回 1;否则返回 0,因为 x!=y
。Edit1: The above is equivalent to
int equal(int x, int y){
return !(x & ~y) ; // returns 1 if equal , 0 otherwise.
}
return !(x & (~y +1) );
return
代替 if
来返回结果。 - mpenx
是负数会发生什么?假设 x = -1
且 y = 0
,那么 if ( !( x & ( ~( y + 1 )) ) )
应该如何工作?如果 x = -1
且 y = -1
呢?return x ^ y:
应该可以解决。 - Michi