not*_*33t 24 c binary bit-manipulation
仅使用按位运算符(|,&,〜,^,>>,<<)和其他基本运算符(如+, - 和!),是否可以替换下面的"=="?
int equal(int x, int y) {
return x == y;
}
Run Code Online (Sandbox Code Playgroud)
Ign*_*ams 67
请记住,a XOR
与a完全相同,NOT EQUALS
并且XNOR
完全相同EQUALS
.因此,以下内容将为您提供您想要的内容:
return !(x ^ y);
Run Code Online (Sandbox Code Playgroud)
sth*_*sth 22
如果它们之间没有差异,则两个数字相等:
int equal(int x, int y){
return !(x-y);
}
Run Code Online (Sandbox Code Playgroud)
Fab*_*sen 14
C !
运算符实际上只是简写!= 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
Run Code Online (Sandbox Code Playgroud)
也就是说,实际的编译器没有这个问题.真正的硬件实际上直接支持比较.细节取决于架构,但有两个基本模型:
更多类似RISC的平台通常具有直接"分支如果相等"和"分支如果小于"操作数,它们根据结果进行比较和分支.它基本上等同于C代码
if (a == b) goto label;
Run Code Online (Sandbox Code Playgroud)
要么
if (a < b) goto label;
Run Code Online (Sandbox Code Playgroud)
一体机指令.
归档时间: |
|
查看次数: |
32133 次 |
最近记录: |